/***************************************************************************\
*
* Module Name: PMWIN.H
*
* OS/2 Presentation Manager Window Manager include file
*
* Copyright (c) 1989-1990, Microsoft Corporation.  All rights reserved.
*
* =======================================================================
*
* The folowing symbols are used in this file for conditional sections.
*
* If INCL_WIN is defined, all subcomponents are included.
*
* Subcomponents marked with "+" are partially included by default:
*
*   #define:		    To include:
*
* + INCL_WINWINDOWMGR	    General window management
* + INCL_WINMESSAGEMGR	    Message management
* + INCL_WININPUT	    Mouse and keyboard input
* + INCL_WINDIALOGS	    Dialog boxes
* + INCL_WINSTATICS	    Static controls
* + INCL_WINBUTTONS	    Button controls
* + INCL_WINENTRYFIELDS     Entry Fields
*   INCL_WINMLE 	    Multiple Line Entry Fields
* + INCL_WINLISTBOXES	    List box controls
* + INCL_WINMENUS	    Menu controls
* + INCL_WINSCROLLBARS	    Scroll bar controls
* + INCL_WINFRAMEMGR	    Frame manager
*   INCL_WINFRAMECTLS	    Frame controls (title bars & size border)
*   INCL_WINRECTANGLES	    Rectangle routines
*   INCL_WINSYS 	    System values (and colors)
*   INCL_WINTIMER	    Timer routines
* + INCL_WINACCELERATORS    Keyboard accelerators
*   INCL_WINTRACKRECT	    WinTrackRect() function
*   INCL_WINCLIPBOARD	    Clipboard manager
* + INCL_WINCURSORS	    Text cursors
* + INCL_WINPOINTERS	    Mouse pointers
*   INCL_WINHOOKS	    Hook manager
* + INCL_WINSWITCHLIST	    Shell Switch List API
*   INCL_WINPROGRAMLIST     Shell Program List API
*   INCL_WINSHELLDATA	    Shell Data (?)
*   INCL_WINCOUNTRY	    Country support
*   INCL_WINHEAP	    Heap Manager
*   INCL_WINATOM	    Atom Manager
*   INCL_WINCATCHTHROW	    WinCatch/WinThrow support
*   INCL_WINERRORS	    Error code definitions
*   INCL_NLS		    DBCS window manager definition
* + INCL_WINHELP	    Help Manager definitions
*   INCL_WINLOAD	    Load/Delete Library/Procedure
*   INCL_WINTYPES	    Definitions for Datatypes
*
\***************************************************************************/

#define INCL_WININCLUDED


#ifdef INCL_WIN

#define INCL_WINWINDOWMGR
#define INCL_WINMESSAGEMGR
#define INCL_WININPUT
#define INCL_WINDIALOGS
#define INCL_WINSTATICS
#define INCL_WINBUTTONS
#define INCL_WINENTRYFIELDS
#define INCL_WINMLE
#define INCL_WINLISTBOXES
#define INCL_WINMENUS
#define INCL_WINSCROLLBARS
#define INCL_WINFRAMEMGR
#define INCL_WINFRAMECTLS
#define INCL_WINRECTANGLES
#define INCL_WINSYS
#define INCL_WINTIMER
#define INCL_WINACCELERATORS
#define INCL_WINTRACKRECT
#define INCL_WINCLIPBOARD
#define INCL_WINCURSORS
#define INCL_WINPOINTERS
#define INCL_WINHOOKS
#define INCL_WINSWITCHLIST
#define INCL_WINPROGRAMLIST
#define INCL_WINSHELLDATA
#define INCL_WINCOUNTRY
#define INCL_WINHEAP
#define INCL_WINATOM
#define INCL_WINCATCHTHROW
#define INCL_WINERRORS
#define INCL_WINDDE
#define INCL_WINHELP
#define INCL_WINLOAD
#define INCL_WINTYPES

#else /* INCL_WIN */

#ifdef RC_INVOKED
#define INCL_WININPUT
#define INCL_WINDIALOGS
#define INCL_WINSTATICS
#define INCL_WINBUTTONS
#define INCL_WINENTRYFIELDS
#define INCL_WINLISTBOXES
#define INCL_WINMENUS
#define INCL_WINSCROLLBARS
#define INCL_WINFRAMEMGR
#define INCL_WINFRAMECTLS
#define INCL_WINACCELERATORS
#define INCL_WINPOINTERS
#define INCL_WINMESSAGEMGR
#define INCL_WINMLE
#define INCL_WINHELP
#endif /* RC_INVOKED */

#endif /* INCL_WIN */

/* ensure standard entry field defintions if MLE is defined */
#ifdef INCL_WINMLE
#ifndef INCL_WINENTRYFIELDS
#define INCL_WINENTRYFIELDS
#endif /* INCL_WINENTRYFIELDS */
#endif /* INCL_WINMLE */

/* INCL_WINCOMMON compatability */
#ifdef INCL_WINCOMMON
#define INCL_WINWINDOWMGR
#endif /* INCL_WINCOMMON */

#ifdef INCL_ERRORS
#define INCL_WINERRORS
#endif  /* INCL_ERRORS */

/***************************************************************************/
/***	    General Window Management types, constants and macros	 ***/

#ifndef WIN_COMMON_INCLUDED
#define WIN_COMMON_INCLUDED

typedef VOID FAR *MPARAM;	/* mp	 */
typedef MPARAM FAR *PMPARAM;	/* pmp	 */
typedef VOID FAR *MRESULT;	/* mres  */
typedef MRESULT FAR *PMRESULT;	/* pmres */

/* Macros to make an MPARAM from standard types. */
#define MPFROMP(p)		   ((MPARAM)(VOID FAR *)(p))
#define MPFROMHWND(hwnd)	   ((MPARAM)(HWND)(hwnd))
#define MPFROMCHAR(ch)		   ((MPARAM)(USHORT)(ch))
#define MPFROMSHORT(s)		   ((MPARAM)(USHORT)(s))
#define MPFROM2SHORT(s1, s2)	   ((MPARAM)MAKELONG(s1, s2))
#define MPFROMSH2CH(s, uch1, uch2) ((MPARAM)MAKELONG(s, MAKESHORT(uch1, uch2)))
#define MPFROMLONG(l)		   ((MPARAM)(ULONG)(l))

/* Macros to extract standard types from an MPARAM */
#define PVOIDFROMMP(mp) 	((VOID FAR *)(mp))
#define HWNDFROMMP(mp)		((HWND)(mp))
#define CHAR1FROMMP(mp) 	((UCHAR)(mp))
#define CHAR2FROMMP(mp) 	((UCHAR)((ULONG)mp >> 8))
#define CHAR3FROMMP(mp) 	((UCHAR)((ULONG)mp >> 16))
#define CHAR4FROMMP(mp) 	((UCHAR)((ULONG)mp >> 24))
#define SHORT1FROMMP(mp)	((USHORT)(ULONG)(mp))
#define SHORT2FROMMP(mp)	((USHORT)((ULONG)mp >> 16))
#define LONGFROMMP(mp)		((ULONG)(mp))

/* Macros to make an MRESULT from standard types. */
#define MRFROMP(p)		((MRESULT)(VOID FAR *)(p))
#define MRFROMSHORT(s)		((MRESULT)(USHORT)(s))
#define MRFROM2SHORT(s1, s2)	((MRESULT)MAKELONG(s1, s2))
#define MRFROMLONG(l)		((MRESULT)(ULONG)(l))

/* Macros to extract standard types from an MRESULT */
#define PVOIDFROMMR(mr) 	((VOID FAR *)(mr))
#define SHORT1FROMMR(mr)	((USHORT)((ULONG)mr))
#define SHORT2FROMMR(mr)	((USHORT)((ULONG)mr >> 16))
#define LONGFROMMR(mr)		((ULONG)(mr))

typedef MRESULT (EXPENTRY *PFNWP)(HWND, USHORT, MPARAM, MPARAM);

#ifndef INCL_SAADEFS
#define HWND_DESKTOP		(HWND)1
#define HWND_OBJECT		(HWND)2
#endif /* !INCL_SAADEFS */

#define HWND_TOP		(HWND)3
#define HWND_BOTTOM		(HWND)4

#ifndef INCL_SAADEFS
#define HWND_THREADCAPTURE	(HWND)5
#endif /* !INCL_SAADEFS */


/* Standard Window Styles */

#define WS_VISIBLE		0x80000000L
#define WS_DISABLED		0x40000000L
#define WS_CLIPCHILDREN 	0x20000000L
#define WS_CLIPSIBLINGS 	0x10000000L
#define WS_PARENTCLIP		0x08000000L
#define WS_SAVEBITS		0x04000000L
#define WS_SYNCPAINT		0x02000000L
#define WS_MINIMIZED		0x01000000L
#define WS_MAXIMIZED		0x00800000L

/* Dialog manager styles */

#define WS_GROUP		0x00010000L
#define WS_TABSTOP		0x00020000L
#define WS_MULTISELECT		0x00040000L


/* Class styles */

#define CS_MOVENOTIFY		0x00000001L
#define CS_SIZEREDRAW		0x00000004L
#define CS_HITTEST		0x00000008L
#define CS_PUBLIC		0x00000010L
#define CS_FRAME		0x00000020L
#define CS_CLIPCHILDREN 	0x20000000L
#define CS_CLIPSIBLINGS 	0x10000000L
#define CS_PARENTCLIP		0x08000000L
#define CS_SAVEBITS		0x04000000L
#define CS_SYNCPAINT		0x02000000L

#endif /* WIN_COMMON_INCLUDED */

/***************************************************************************/
/****	    Window Manager Subsection part 1				****/
#if ((defined(INCL_WINWINDOWMGR) || !defined(INCL_NOCOMMON)) && !defined(INCL_WINWINDOWMGR_INCLUDED))

BOOL	APIENTRY WinRegisterClass(HAB hab, PSZ pszClassName, PFNWP pfnWndProc,
				  ULONG flStyle, USHORT cbWindowData);

MRESULT APIENTRY WinDefWindowProc(HWND hwnd, USHORT msg, MPARAM mp1,
				  MPARAM mp2);
BOOL	APIENTRY WinDestroyWindow(HWND hwnd);
BOOL	APIENTRY WinShowWindow(HWND hwnd, BOOL fShow);
BOOL	APIENTRY WinQueryWindowRect(HWND hwnd, PRECTL prclDest);

HPS   APIENTRY WinGetPS(HWND hwnd);
BOOL  APIENTRY WinReleasePS(HPS hps);
BOOL  APIENTRY WinEndPaint(HPS hps);
#ifndef INCL_SAADEFS
HPS   APIENTRY WinGetClipPS(HWND hwnd, HWND hwndClip, USHORT fs);
BOOL  APIENTRY WinIsWindowShowing(HWND hwnd);
#endif /* !INCL_SAADEFS */

HPS   APIENTRY WinBeginPaint(HWND hwnd, HPS hps, PRECTL prclPaint);
HDC   APIENTRY WinOpenWindowDC(HWND hwnd);

SHORT APIENTRY WinScrollWindow(HWND hwnd, SHORT dx, SHORT dy,
			       PRECTL prclScroll, PRECTL prclClip,
			       HRGN hrgnUpdate, PRECTL prclUpdate,
			       USHORT fs);

/* WinGetClipPS() flags */

#ifndef INCL_SAADEFS
#define PSF_LOCKWINDOWUPDATE	0x0001
#define PSF_CLIPUPWARDS 	0x0002
#define PSF_CLIPDOWNWARDS	0x0004
#define PSF_CLIPSIBLINGS	0x0008
#define PSF_CLIPCHILDREN	0x0010
#define PSF_PARENTCLIP		0x0020

#endif /* !INCL_SAADEFS */

/* WinScrollWindow() flags */

#define SW_SCROLLCHILDREN	0x0001
#define SW_INVALIDATERGN	0x0002

BOOL  APIENTRY WinFillRect(HPS hps, PRECTL prcl, COLOR clr);

/* WinInitialize/WinTerminate Interface declarations */

typedef struct _QVERSDATA { /* qver */
	USHORT environment;
	USHORT version;
} QVERSDATA;
typedef QVERSDATA FAR *PQVERSDATA;

#define QV_OS2			0x0000
#define QV_CMS			0x0001
#define QV_TSO			0x0002
#define QV_TSOBATCH		0x0003
#define QV_OS400		0x0004


ULONG APIENTRY WinQueryVersion(HAB hab);
HAB   APIENTRY WinInitialize(USHORT fsOptions);
BOOL  APIENTRY WinTerminate(HAB hab);

HAB   APIENTRY WinQueryAnchorBlock(HWND hwnd);

#endif /* INCL_WINWINDOWMGR | !INCL_NOCOMMON */
/******************  End of Window Manager COMMON section ******************/

#ifndef WIN_COMMON2_INCLUDED
#define WIN_COMMON2_INCLUDED

HWND   APIENTRY WinCreateWindow(HWND hwndParent, PSZ pszClass, PSZ pszName,
				ULONG flStyle, SHORT x, SHORT y, SHORT cx,
				SHORT cy, HWND hwndOwner,
				HWND hwndInsertBehind, USHORT id,
				PVOID pCtlData, PVOID pPresParams);
BOOL   APIENTRY WinEnableWindow(HWND hwnd, BOOL fEnable);
BOOL   APIENTRY WinIsWindowEnabled(HWND hwnd);
BOOL   APIENTRY WinEnableWindowUpdate(HWND hwnd, BOOL fEnable);
BOOL   APIENTRY WinIsWindowVisible(HWND hwnd);
SHORT  APIENTRY WinQueryWindowText(HWND hwnd, SHORT cchBufferMax,
				   PSZ pszBuf);
BOOL   APIENTRY WinSetWindowText(HWND hwnd, PSZ pszText);
SHORT  APIENTRY WinQueryWindowTextLength(HWND hwnd);
HWND   APIENTRY WinWindowFromID(HWND hwndParent, USHORT id);

BOOL   APIENTRY WinIsWindow(HAB hab, HWND hwnd);
HWND   APIENTRY WinQueryWindow(HWND hwnd, SHORT cmd, BOOL fLock);
SHORT  APIENTRY WinMultWindowFromIDs(HWND hwndParent, PHWND phwnd,
				     USHORT idFirst, USHORT idLast);

/* WinQueryWindow() codes */

#define QW_NEXT 	0
#define QW_PREV 	1
#define QW_TOP		2
#define QW_BOTTOM	3
#define QW_OWNER	4
#define QW_PARENT	5
#define QW_NEXTTOP	6
#define QW_PREVTOP	7
#define QW_FRAMEOWNER	8


BOOL APIENTRY WinSetParent(HWND hwnd, HWND hwndNewParent, BOOL fRedraw);

BOOL APIENTRY WinIsChild(HWND hwnd, HWND hwndParent);
BOOL APIENTRY WinSetOwner(HWND hwnd, HWND hwndNewOwner);
#ifndef INCL_SAADEFS
BOOL APIENTRY WinQueryWindowProcess(HWND hwnd, PPID ppid, PTID ptid);
#endif /* !INCL_SAADEFS */

HWND APIENTRY WinQueryObjectWindow(HWND hwndDesktop);
HWND APIENTRY WinQueryDesktopWindow(HAB hab, HDC hdc);

/*** Window positioning functions */

/* WinSetMultWindowPos() structure */
typedef struct _SWP { /* swp */
	USHORT	fs;
	SHORT	cy;
	SHORT	cx;
	SHORT	y;
	SHORT	x;
	HWND	hwndInsertBehind;
	HWND	hwnd;
} SWP;
typedef SWP FAR *PSWP;

BOOL APIENTRY WinSetWindowPos(HWND hwnd, HWND hwndInsertBehind, SHORT x,
				SHORT y, SHORT cx, SHORT cy, USHORT fs);
BOOL APIENTRY WinQueryWindowPos(HWND hwnd, PSWP pswp);
BOOL APIENTRY WinSetMultWindowPos(HAB hab, PSWP pswp, USHORT cswp);

/* Values returned from WM_ADJUSTWINDOWPOS and passed to WM_WINDOWPOSCHANGED */

#define AWP_MINIMIZED		0x00010000L
#define AWP_MAXIMIZED		0x00020000L
#define AWP_RESTORED		0x00040000L
#define AWP_ACTIVATE		0x00080000L
#define AWP_DEACTIVATE		0x00100000L

/* WinSetWindowPos() flags */

#define SWP_SIZE		0x0001
#define SWP_MOVE		0x0002
#define SWP_ZORDER		0x0004
#define SWP_SHOW		0x0008
#define SWP_HIDE		0x0010
#define SWP_NOREDRAW		0x0020
#define SWP_NOADJUST		0x0040
#define SWP_ACTIVATE		0x0080
#define SWP_DEACTIVATE		0x0100
#define SWP_EXTSTATECHANGE	0x0200
#define SWP_MINIMIZE		0x0400
#define SWP_MAXIMIZE		0x0800
#define SWP_RESTORE		0x1000
#define SWP_FOCUSACTIVATE	0x2000
#define SWP_FOCUSDEACTIVATE	0x4000

/* Window painting */

BOOL APIENTRY WinUpdateWindow(HWND hwnd);

BOOL APIENTRY WinInvalidateRect(HWND hwnd, PRECTL prcl, BOOL fIncludeChildren);
BOOL APIENTRY WinInvalidateRegion(HWND hwnd, HRGN hrgn,
				  BOOL fIncludeChildren);

/* Drawing helpers */

BOOL APIENTRY WinInvertRect(HPS hps, PRECTL prcl);
BOOL APIENTRY WinDrawBitmap(HPS hpsDst, HBITMAP hbm, PRECTL prclSrc,
			    PPOINTL pptlDst, LONG clrFore, LONG clrBack,
			    USHORT fs);

/* WinDrawBitmap() flags */

#define DBM_NORMAL		0x0000
#define DBM_INVERT		0x0001
#define DBM_HALFTONE		0x0002
#define DBM_STRETCH		0x0004
#define DBM_IMAGEATTRS		0x0008


SHORT APIENTRY WinDrawText(HPS hps, SHORT cchText, PCH lpchText, PRECTL prcl,
			   LONG clrFore, LONG clrBack, USHORT fsCmd);
/*
 * WinDrawText() codes:
 * From DT_LEFT to DT_EXTERNALLEADING, the codes are designed to be OR'ed with
 * SS_TEXT to create variations of the basic text static item.
 */
#define DT_LEFT 		0x0000
#define DT_EXTERNALLEADING	0x0080
#define DT_CENTER		0x0100
#define DT_RIGHT		0x0200
#define DT_TOP			0x0000
#define DT_VCENTER		0x0400
#define DT_BOTTOM		0x0800
#define DT_HALFTONE		0x1000
#define DT_MNEMONIC		0x2000
#define DT_WORDBREAK		0x4000
#define DT_ERASERECT		0x8000
#define DT_QUERYEXTENT		0x0002
#define DT_TEXTATTRS		0x0040


BOOL APIENTRY WinDrawBorder(HPS hps, PRECTL prcl, SHORT cx, SHORT cy,
			    LONG clrFore, LONG clrBack, USHORT fsCmd);

/* WinDrawBorder() flags */

#define DB_PATCOPY		0x0000
#define DB_PATINVERT		0x0001
#define DB_DESTINVERT		0x0002
#define DB_AREAMIXMODE		0x0003

#define DB_ROP			0x0007
#define DB_INTERIOR		0x0008
#define DB_AREAATTRS		0x0010
#define DB_STANDARD		0x0100
#define DB_DLGBORDER		0x0200


/** Resource loading functions */

SHORT APIENTRY WinLoadString(HAB hab, HMODULE hmod, USHORT id, SHORT cchMax,
			     PSZ pszBuffer);
#ifndef INCL_SAADEFS
SHORT APIENTRY WinLoadMessage(HAB hab, HMODULE hmod, USHORT id, SHORT cchMax,
			      PSZ pszBuffer);


#endif /* !INCL_SAADEFS */
#endif /* WIN_COMMON2_INCLUDED */

/***************************************************************************/
/****		      Window Manager Subsection part 2			****/
#if ((defined(INCL_WINWINDOWMGR) || !defined(INCL_NOCOMMON)) && !defined(INCL_WINWINDOWMGR_INCLUDED))

BOOL APIENTRY WinSetActiveWindow(HWND hwndDesktop, HWND hwnd);

#endif /* Window Manager COMMON subsection */

#if (defined(INCL_WINWINDOWMGR) && !defined(INCL_WINWINDOWMGR_INCLUDED))

/* WM_CREATE structure */

typedef struct _CREATESTRUCT { /* crst */
	PVOID	pPresParams;
	PVOID	pCtlData;
	USHORT	id;
	HWND	hwndInsertBehind;
	HWND	hwndOwner;
	SHORT	cy;
	SHORT	cx;
	SHORT	y;
	SHORT	x;
	ULONG	flStyle;
	PSZ	pszText;
	PSZ	pszClass;
	HWND	hwndParent;
} CREATESTRUCT;
typedef CREATESTRUCT FAR *PCREATESTRUCT;

/* WinQueryClassInfo() structure */

typedef struct _CLASSINFO { /* clsi */
	ULONG	flClassStyle;
	PFNWP	pfnWindowProc;
	USHORT	cbWindowData;
} CLASSINFO;
typedef CLASSINFO FAR *PCLASSINFO;

#ifndef INCL_SAADEFS
PFNWP  APIENTRY WinSubclassWindow(HWND hwnd, PFNWP pfnwp);
#endif /* !INCL_SAADEFS */

SHORT  APIENTRY WinQueryClassName(HWND hwnd, SHORT cchMax, PSZ psz);
BOOL   APIENTRY WinQueryClassInfo(HAB hab, PSZ pszClassName,
				  PCLASSINFO pclsi);

HWND   APIENTRY WinQueryActiveWindow(HWND hwndDesktop, BOOL fLock);

#ifndef INCL_SAADEFS
BOOL   APIENTRY WinIsThreadActive(HAB hab);
#endif /* !INCL_SAADEFS */
HWND   APIENTRY WinQuerySysModalWindow(HWND hwndDesktop, BOOL fLock);

HWND   APIENTRY WinLockWindow(HWND hwnd, BOOL fLock);
#ifndef INCL_SAADEFS
BOOL   APIENTRY WinRegisterWindowDestroy(HWND hwnd, BOOL fRegister);
#endif /* !INCL_SAADEFS */
BOOL   APIENTRY WinSetSysModalWindow(HWND hwndDesktop, HWND hwnd);

SHORT  APIENTRY WinQueryWindowLockCount(HWND hwnd);

#ifndef INCL_SAADEFS
USHORT APIENTRY WinQueryWindowUShort(HWND hwnd, SHORT index);
BOOL   APIENTRY WinSetWindowUShort(HWND hwnd, SHORT index, USHORT us);
ULONG  APIENTRY WinQueryWindowULong(HWND hwnd, SHORT index);
BOOL   APIENTRY WinSetWindowULong(HWND hwnd, SHORT index, ULONG ul);
PVOID  APIENTRY WinQueryWindowPtr(HWND hwnd, SHORT index);
BOOL   APIENTRY WinSetWindowPtr(HWND hwnd, SHORT index, PVOID p);
BOOL   APIENTRY WinSetWindowBits(HWND hwnd, SHORT index, ULONG flData,
				 ULONG flMask);

/* Standard WinQueryWindowUShort/ULong() indices */

#define QWS_USER		0
#define QWS_ID			(-1)
#define QWS_MIN 		(-1)

#define QWL_USER		0
#define QWL_STYLE		(-2)
#define QWP_PFNWP		(-3)
#define QWL_HMQ 		(-4)
#define QWL_MIN 		(-4)

/* WC_FRAME WinQueryWindowUShort/ULong() indices */

#define QWL_HHEAP		0x0004
#define QWL_HWNDFOCUSSAVE	0x0018

#define QWS_FLAGS		0x0008
#define QWS_RESULT		0x000a
#define QWS_XRESTORE		0x000c
#define QWS_YRESTORE		0x000e
#define QWS_CXRESTORE		0x0010
#define QWS_CYRESTORE		0x0012
#define QWS_XMINIMIZE		0x0014
#define QWS_YMINIMIZE		0x0016


/* Window enumeration */

typedef LHANDLE HENUM;  /* henum */

HENUM APIENTRY WinBeginEnumWindows(HWND hwnd);
HWND  APIENTRY WinGetNextWindow(HENUM henum);
BOOL  APIENTRY WinEndEnumWindows(HENUM henum);

#endif /* !INCL_SAADEFS */

HWND  APIENTRY WinWindowFromPoint(HWND hwnd, PPOINTL pptl, BOOL fChildren,
				  BOOL fLock);
BOOL  APIENTRY WinMapWindowPoints(HWND hwndFrom, HWND hwndTo, PPOINTL pptl,
				  SHORT cwpt);

/* WinExcludeUpdateRegion return values */

#define EXRGN_ERROR   0x0000
#define EXRGN_NULL    0x0001
#define EXRGN_RECT    0x0002
#define EXRGN_COMPLEX 0x0003

/* More window painting functions */

BOOL  APIENTRY WinValidateRect(HWND hwnd, PRECTL prcl, BOOL fIncludeChildren);
BOOL  APIENTRY WinValidateRegion(HWND hwnd, HRGN hrgn, BOOL fIncludeChildren);
#ifndef INCL_SAADEFS
HWND  APIENTRY WinWindowFromDC(HDC hdc);
HDC   APIENTRY WinQueryWindowDC(HWND hwnd);
HPS   APIENTRY WinGetScreenPS(HWND hwndDesktop);
BOOL  APIENTRY WinLockWindowUpdate(HWND hwndDesktop, HWND hwndLockUpdate);
BOOL  APIENTRY WinLockVisRegions(HWND hwndDesktop, BOOL fLock);
#endif /* !INCL_SAADEFS */
BOOL  APIENTRY WinQueryUpdateRect(HWND hwnd, PRECTL prcl);
SHORT APIENTRY WinQueryUpdateRegion(HWND hwnd, HRGN hrgn);
SHORT APIENTRY WinExcludeUpdateRegion(HPS hps, HWND hwnd);

#endif /* INCL_WINWINDOWMGR */

#if ((defined(INCL_WINMESSAGEMGR) || !defined(INCL_NOCOMMON)) && !defined(INCL_WINMESSAGEMGR_INCLUDED))

/* QMSG structure */

typedef struct _QMSG { /* qmsg */
	HWND	hwnd;
	USHORT	msg;
	MPARAM	mp1;
	MPARAM	mp2;
	ULONG	time;
	POINTL	ptl;
} QMSG;
typedef QMSG FAR *PQMSG;

typedef LHANDLE HMQ;    /* hmq */

/*
** This is the standard function definition for window procedures.
** Typically they are names like "XxxxxxxxWndProc", where the prefix
** "Xxxxxxxxx" is replaced by some name descriptive of the window procedure
** being declared.  Window procedures must be EXPORTED in the definitions
** file used by the linker.
**
** MRESULT EXPENTRY MyclassWndProc(HWND hwnd,	** window handle	**
**				   USHORT msg,	** message number	**
**				   MPARAM mp1,	** 1st (packed) parms	**
**				   MPARAM mp2); ** 2nd (packed) parms	**
*/

/* Standard Window Messages */

#define WM_NULL 		0x0000
#define WM_CREATE		0x0001
#define WM_DESTROY		0x0002

#ifndef INCL_SAADEFS
#define WM_OTHERWINDOWDESTROYED 0x0003
#endif /* !INCL_SAADEFS */

#define WM_ENABLE		0x0004
#define WM_SHOW 		0x0005
#define WM_MOVE 		0x0006
#define WM_SIZE 		0x0007
#define WM_ADJUSTWINDOWPOS	0x0008

#define WM_CALCVALIDRECTS	0x0009

#define WM_SETWINDOWPARAMS	0x000a
#define WM_QUERYWINDOWPARAMS	0x000b
#define WM_HITTEST		0x000c
#define WM_ACTIVATE		0x000d
#define WM_SETFOCUS		0x000f
#define WM_SETSELECTION 	0x0010

/* language support Winproc */
#define WM_PPAINT		0x0011
#define WM_PSETFOCUS		0x0012
#define WM_PSYSCOLORCHANGE	0x0013
#define WM_PSIZE		0x0014
#define WM_PACTIVATE		0x0015
#define WM_PCONTROL		0x0016


#define WM_COMMAND		0x0020
#define WM_SYSCOMMAND		0x0021
#define WM_HELP 		0x0022
#define WM_PAINT		0x0023

#ifndef INCL_SAADEFS
#define WM_TIMER		0x0024
#define WM_SEM1 		0x0025
#define WM_SEM2 		0x0026
#define WM_SEM3 		0x0027
#define WM_SEM4 		0x0028
#endif /* !INCL_SAADEFS */

#define WM_CLOSE		0x0029
#define WM_QUIT 		0x002a
#define WM_SYSCOLORCHANGE	0x002b
#define WM_SYSVALUECHANGED	0x002d
#define WM_APPTERMINATENOTIFY	0x002e
#define WM_PRESPARAMCHANGED	0x002f

/* Control notification messages */

#define WM_CONTROL		0x0030
#define WM_VSCROLL		0x0031
#define WM_HSCROLL		0x0032
#define WM_INITMENU		0x0033
#define WM_MENUSELECT		0x0034
#define WM_MENUEND		0x0035
#define WM_DRAWITEM		0x0036
#define WM_MEASUREITEM		0x0037
#define WM_CONTROLPOINTER	0x0038
#define WM_CONTROLHEAP		0x0039
#define WM_QUERYDLGCODE 	0x003a
#define WM_INITDLG		0x003b
#define WM_SUBSTITUTESTRING	0x003c
#define WM_MATCHMNEMONIC	0x003d
#define WM_SAVEAPPLICATION	0x003e

/* Reserve a range of messages for help manager.  This range includes  */
/* public messages, defined below, and private ones, which need to be  */
/* reserved here to prevent clashing with application messages         */

#define WM_HELPBASE		0x0F00 /* Start of msgs for help manager */
#define WM_HELPTOP		0x0FFF /* End of msgs for help manager	 */

#define WM_USER 		0x1000

/* WM_COMMAND msg source codes */

#define CMDSRC_PUSHBUTTON	1
#define CMDSRC_MENU		2
#define CMDSRC_ACCELERATOR	3
#define CMDSRC_OTHER		0

/*
 * The following structure and macro are used to access the
 * WM_COMMAND, WM_HELP, and WM_SYSCOMMAND message parameters:
 */
typedef struct _COMMANDMSG { /* commandmsg */
	USHORT	source; 	/* mp2 */
	BOOL	fMouse;
	USHORT	cmd;		/* mp1 */
	USHORT	unused;
} CMDMSG;

#define COMMANDMSG(pmsg) \
	((struct _COMMANDMSG FAR *)((PBYTE)pmsg - sizeof(MPARAM) * 2))

/*
 * The following structure is used by the WinQueryQueueInfo() routine
 */
typedef struct _MQINFO { /* mqi */
	USHORT	cb;
	PID	pid;
	TID	tid;
	USHORT	cmsgs;
	PVOID	pReserved;
} MQINFO;
typedef MQINFO FAR *PMQINFO;

/* WinCreateMsgQueue default size */

#define DEFAULT_QUEUE_SIZE  0x0000

MRESULT APIENTRY WinSendMsg(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
HMQ	APIENTRY WinCreateMsgQueue(HAB hab, SHORT cmsg);
BOOL	APIENTRY WinDestroyMsgQueue(HMQ hmq);
BOOL	APIENTRY WinQueryQueueInfo(HMQ hmq, PMQINFO pmqi, USHORT cbCopy);

#ifndef INCL_SAADEFS
BOOL	APIENTRY WinCancelShutdown(HMQ hmq, BOOL fCancelAlways);
#endif /* INCL_SAADEFS */

BOOL	APIENTRY WinGetMsg(HAB hab, PQMSG pqmsg, HWND hwndFilter,
			   USHORT msgFilterFirst, USHORT msgFilterLast);
BOOL	APIENTRY WinPeekMsg(HAB hab, PQMSG pqmsg, HWND hwndFilter,
			    USHORT msgFilterFirst, USHORT msgFilterLast,
			    USHORT fs);

MRESULT APIENTRY WinDispatchMsg(HAB hab, PQMSG pqmsg);

BOOL	APIENTRY WinPostMsg(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2);
BOOL	APIENTRY WinRegisterUserMsg(HAB hab, USHORT msgid, SHORT datatype1,
				    SHORT dir1, SHORT datatype2, SHORT dir2,
				    SHORT datatyper);
BOOL	APIENTRY WinRegisterUserDatatype(HAB hab, SHORT datatype,
					 SHORT count, PSHORT types);
BOOL	APIENTRY WinSetMsgMode(HAB hab, PSZ classname,
			       SHORT control);
BOOL	APIENTRY WinSetSynchroMode(HAB hab, SHORT mode);

/* WinPeekMsg() constants */

#define PM_REMOVE		0x0001
#define PM_NOREMOVE		0x0000

/* WinRegisterUserDatatype datatypes defined in separate file */
#if (defined(INCL_WINTYPES) && !defined(PMTYPES_INCLUDED))
#include <pmtypes.h>
#endif /*INCL_WINTYPES*/

/* WinRegisterUserMsg direction codes */

#define RUM_IN			1
#define RUM_OUT 		2
#define RUM_INOUT		3

/* WinSetMsgMode constants */

#define SMD_DELAYED		0x0001
#define SMD_IMMEDIATE		0x0002

/* WinSetSynchroMode constants */

#define SSM_SYNCHRONOUS 	0x0001
#define SSM_ASYNCHRONOUS	0x0002
#define SSM_MIXED		0x0003

#endif /* WINMESSAGEMGR || !INCL_NOCOMMON       */

#if (defined(INCL_WINMESSAGEMGR) && !defined(INCL_WINMESSAGEMGR_INCLUDED))
#define INCL_WINMESSAGEMGR_INCLUDED

/* WM_CALCVALIDRECTS return flags */

#define CVR_ALIGNLEFT		0x0001
#define CVR_ALIGNBOTTOM 	0x0002
#define CVR_ALIGNRIGHT		0x0004
#define CVR_ALIGNTOP		0x0008
#define CVR_REDRAW		0x0010


/* WM_HITTEST return codes */

#define HT_NORMAL		0
#define HT_TRANSPARENT		(-1)
#define HT_DISCARD		(-2)
#define HT_ERROR		(-3)


/* WM_SET/QUERYWINDOWPARAMS structures and flags */

typedef struct _WNDPARAMS { /* wprm */
	USHORT	fsStatus;
	USHORT	cchText;
	PSZ	pszText;
	USHORT	cbPresParams;
	PVOID	pPresParams;
	USHORT	cbCtlData;
	PVOID	pCtlData;
} WNDPARAMS;
typedef WNDPARAMS FAR *PWNDPARAMS;

/* Flags used by WM_SET/QUERYWINDOWPARAMS */

#define WPM_TEXT		0x0001
#define WPM_CTLDATA		0x0002
#define WPM_PRESPARAMS		0x0004
#define WPM_CCHTEXT		0x0008
#define WPM_CBCTLDATA		0x0010
#define WPM_CBPRESPARAMS	0x0020

#ifndef INCL_SAADEFS
BOOL    APIENTRY WinInSendMsg(HAB hab);

#endif /* INCL_SAADEFS */

BOOL    APIENTRY WinBroadcastMsg(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2,
				 USHORT fs);

/* WinBroadcastMsg codes */

#define BMSG_POST		0x0000
#define BMSG_SEND		0x0001
#define BMSG_POSTQUEUE		0x0002
#define BMSG_DESCENDANTS	0x0004
#define BMSG_FRAMEONLY		0x0008


BOOL  APIENTRY WinWaitMsg(HAB hab, USHORT msgFirst, USHORT msgLast);

#ifndef INCL_SAADEFS
ULONG APIENTRY WinQueryQueueStatus(HWND hwndDesktop);

/* WinQueryQueueStatus() constants */

#define QS_KEY			0x0001
#define QS_MOUSEBUTTON		0x0002
#define QS_MOUSEMOVE		0x0004
#define QS_MOUSE		0x0006	 /* QS_MOUSEMOVE|QS_MOUSEBUTTON */
#define QS_TIMER		0x0008
#define QS_PAINT		0x0010
#define QS_POSTMSG		0x0020
#define QS_SEM1 		0x0040
#define QS_SEM2 		0x0080
#define QS_SEM3 		0x0100
#define QS_SEM4 		0x0200
#define QS_SENDMSG		0x0400


BOOL  APIENTRY WinQueryMsgPos(HAB hab, PPOINTL pptl);
ULONG APIENTRY WinQueryMsgTime(HAB hab);

USHORT APIENTRY WinMsgSemWait(HSEM hsem, LONG lTimeout);
USHORT APIENTRY WinMsgMuxSemWait(PUSHORT pisemCleared, PVOID pmxsl,
                                 LONG dtTimeout);
#endif /* !INCL_SAADEFS */
BOOL  APIENTRY WinPostQueueMsg(HMQ hmq, USHORT msg, MPARAM mp1, MPARAM mp2);

#endif /* INCL_WINMESSAGEMGR */

/*** Keyboard and mouse */

#if (defined(INCL_WININPUT) || !defined(INCL_NOCOMMON))

/*** Keyboard and mouse input COMMON subsection */
BOOL  APIENTRY WinSetFocus(HWND hwndDesktop, HWND hwndSetFocus);
BOOL  APIENTRY WinFocusChange(HWND hwndDesktop, HWND hwndSetFocus,
                              USHORT fsFocusChange);

#define FC_NOSETFOCUS		 0x0001
#define FC_NOBRINGTOTOP 	 FC_NOSETFOCUS
#define FC_NOLOSEFOCUS		 0x0002
#define FC_NOBRINGTOPFIRSTWINDOW FC_NOLOSEFOCUS
#define FC_NOSETACTIVEFOCUS	 0x0003
#define FC_NOSETACTIVE		 0x0004
#define FC_NOLOSEACTIVE 	 0x0008
#define FC_NOSETSELECTION	 0x0010
#define FC_NOLOSESELECTION	 0x0020

#define QFC_NEXTINCHAIN 	 0x0001
#define QFC_ACTIVE		 0x0002
#define QFC_FRAME		 0x0003
#define QFC_SELECTACTIVE	 0x0004

#endif  /* Keyboard and mouse input COMMON subsection */

#if (defined(INCL_WININPUT) && !defined(INCL_WININPUT_INCLUDED))
#define INCL_WININPUT_INCLUDED

#ifndef INCL_SAADEFS
BOOL  APIENTRY WinSetCapture(HWND hwndDesktop, HWND hwnd);
#endif /* !INCL_SAADEFS */
HWND  APIENTRY WinQueryCapture(HWND hwndDesktop, BOOL fLock);

/* Mouse input messages */

#ifndef INCL_SAADEFS
#define WM_MOUSEFIRST		0x0070
#define WM_MOUSELAST		0x0079
#define WM_BUTTONCLICKFIRST	0x0071
#define WM_BUTTONCLICKLAST	0x0079
#endif /* !INCL_SAADEFS */
#define WM_MOUSEMOVE		0x0070

#define WM_BUTTON1DOWN		0x0071

#define WM_BUTTON1UP		0x0072
#define WM_BUTTON1DBLCLK	0x0073
#define WM_BUTTON2DOWN		0x0074
#define WM_BUTTON2UP		0x0075
#define WM_BUTTON2DBLCLK	0x0076
#ifndef INCL_SAADEFS
#define WM_BUTTON3DOWN		0x0077
#define WM_BUTTON3UP		0x0078
#define WM_BUTTON3DBLCLK	0x0079
#endif /* !INCL_SAADEFS */

HWND  APIENTRY WinQueryFocus(HWND hwndDesktop, BOOL fLock);


/* Key/Character input messages */

#define WM_CHAR 		0x007a
#define WM_VIOCHAR		0x007b

/* WM_CHAR fs field bits */

#define KC_CHAR 		0x0001
#define KC_VIRTUALKEY		0x0002
#define KC_SCANCODE		0x0004

#define KC_SHIFT		0x0008
#define KC_CTRL 		0x0010
#define KC_ALT			0x0020
#define KC_KEYUP		0x0040
#define KC_PREVDOWN		0x0080
#define KC_LONEKEY		0x0100
#define KC_DEADKEY		0x0200
#define KC_COMPOSITE		0x0400
#define KC_INVALIDCOMP		0x0800

#ifndef INCL_SAADEFS
#define KC_TOGGLE		0x1000
#define KC_INVALIDCHAR		0x2000
#define KC_DBCSRSRVD1		0x4000
#define KC_DBCSRSRVD2		0x8000
#endif /* !INCL_SAADEFS */

/*
 * The following structure and macro are used to access the
 * WM_MOUSEMOVE, and WM_BUTTON message parameters
 */
typedef struct _MOUSEMSG { /* mousemsg */
	USHORT	codeHitTest;	/* mp2	*/
	USHORT	unused;
	SHORT	x;		/* mp1	*/
	SHORT	y;
} MSEMSG;

#define MOUSEMSG(pmsg) \
	((struct _MOUSEMSG FAR *)((PBYTE)pmsg - sizeof(MPARAM) * 2))

/*
 * The following structure and macro are used to access the
 * WM_CHAR message parameters.
 */
typedef struct _CHARMSG { /* charmsg */
	USHORT	chr;		/* mp2	*/
	USHORT	vkey;
	USHORT	fs;		/* mp1	*/
	UCHAR	cRepeat;
	UCHAR	scancode;
} CHRMSG;

#define CHARMSG(pmsg) \
	((struct _CHARMSG FAR *)((PBYTE)pmsg - sizeof(MPARAM) * 2))

/*** Virtual key values */

#define VK_BUTTON1		0x01
#define VK_BUTTON2		0x02
#define VK_BUTTON3		0x03
#define VK_BREAK		0x04
#define VK_BACKSPACE		0x05
#define VK_TAB			0x06
#define VK_BACKTAB		0x07
#define VK_NEWLINE		0x08
#define VK_SHIFT		0x09
#define VK_CTRL 		0x0A
#define VK_ALT			0x0B
#define VK_ALTGRAF		0x0C
#define VK_PAUSE		0x0D
#define VK_CAPSLOCK		0x0E
#define VK_ESC			0x0F
#define VK_SPACE		0x10
#define VK_PAGEUP		0x11
#define VK_PAGEDOWN		0x12
#define VK_END			0x13
#define VK_HOME 		0x14
#define VK_LEFT 		0x15
#define VK_UP			0x16
#define VK_RIGHT		0x17
#define VK_DOWN 		0x18
#define VK_PRINTSCRN		0x19
#define VK_INSERT		0x1A
#define VK_DELETE		0x1B
#define VK_SCRLLOCK		0x1C
#define VK_NUMLOCK		0x1D
#define VK_ENTER		0x1E
#define VK_SYSRQ		0x1F
#define VK_F1			0x20
#define VK_F2			0x21
#define VK_F3			0x22
#define VK_F4			0x23
#define VK_F5			0x24
#define VK_F6			0x25
#define VK_F7			0x26
#define VK_F8			0x27
#define VK_F9			0x28
#define VK_F10			0x29
#define VK_F11			0x2A
#define VK_F12			0x2B
#define VK_F13			0x2C
#define VK_F14			0x2D
#define VK_F15			0x2E
#define VK_F16			0x2F
#define VK_F17			0x30
#define VK_F18			0x31
#define VK_F19			0x32
#define VK_F20			0x33
#define VK_F21			0x34
#define VK_F22			0x35
#define VK_F23			0x36
#define VK_F24			0x37


#define VK_MENU 		VK_F10
#ifdef INCL_NLS
#define VK_DBCSFIRST		0x0080
#define VK_DBCSLAST		0x00ff
#endif /* INCL_NLS */

#define VK_USERFIRST		0x0100
#define VK_USERLAST		0x01ff

#ifndef INCL_SAADEFS

SHORT APIENTRY WinGetKeyState(HWND hwndDesktop, SHORT vkey);
SHORT APIENTRY WinGetPhysKeyState(HWND hwndDesktop, SHORT sc);
BOOL  APIENTRY WinEnablePhysInput(HWND hwndDesktop, BOOL fEnable);
BOOL  APIENTRY WinIsPhysInputEnabled(HWND hwndDesktop);
BOOL  APIENTRY WinSetKeyboardStateTable(HWND hwndDesktop,
					PBYTE pKeyStateTable, BOOL fSet);


/* Journal Notification messages  */
#define WM_JOURNALNOTIFY	0x007c

/*** Define the valid commands (lParm1) for journal notify message */
#define JRN_QUEUESTATUS 	0x00000001L
#define JRN_PHYSKEYSTATE	0x00000002L

#endif /* !INCL_SAADEFS */
#endif /* INCL_WININPUT */


/**** Dialog Manager */

#if (defined(INCL_WINDIALOGS) || !defined(INCL_NOCOMMON))
/**** Dialog Manager COMMON subsection */

/*
** This is the standard function definition for dialog procedures.
** Typically they are names like "XxxxxxxxDlgProc", where the prefix
** "Xxxxxxxxx" is replaced by some name descriptive of the dialog procedure
** being declared.  Dialog procedures must be EXPORTED in the definitions
** file used by the linker.  The dialog procedure declaration is identical
** to that for window procedures.
**
** MRESULT EXPENTRY MydialogDlgProc(HWND hwnd,	 ** window handle	 **
**				    USHORT msg,  ** message number	 **
**				    MPARAM mp1,  ** 1st (packed) parms	 **
**				    MPARAM mp2); ** 2nd (packed) parms	 **
*/

BOOL	APIENTRY WinGetDlgMsg(HWND hwndDlg, PQMSG pqmsg);


HWND	APIENTRY WinLoadDlg(HWND hwndParent, HWND hwndOwner, PFNWP pfnDlgProc,
			    HMODULE hmod, USHORT idDlg, PVOID pCreateParams);
USHORT	APIENTRY WinDlgBox(HWND hwndParent, HWND hwndOwner, PFNWP pfnDlgProc,
			   HMODULE hmod, USHORT idDlg, PVOID pCreateParams);

BOOL	APIENTRY WinDismissDlg(HWND hwndDlg, USHORT usResult);

BOOL	APIENTRY WinQueryDlgItemShort(HWND hwndDlg, USHORT idItem,
				      PSHORT psResult, BOOL fSigned);
BOOL	APIENTRY WinSetDlgItemShort(HWND hwndDlg, USHORT idItem,
				    USHORT usValue, BOOL fSigned);
BOOL	APIENTRY WinSetDlgItemText(HWND hwndDlg, USHORT idItem, PSZ pszText);
USHORT	APIENTRY WinQueryDlgItemText(HWND hwndDlg, USHORT idItem,
				     SHORT cchBufferMax, PSZ pszBuf);
SHORT	APIENTRY WinQueryDlgItemTextLength(HWND hwndDlg, USHORT idItem);

MRESULT APIENTRY WinDefDlgProc(HWND hwndDlg, USHORT msg, MPARAM mp1,
                               MPARAM mp2);

/* Special item IDs */

#ifndef INCL_SAADEFS
#define DID_OK      1
#define DID_CANCEL  2
#define DID_ERROR   0xffff
#endif /* !INCL_SAADEFS */

BOOL APIENTRY WinAlarm(HWND hwndDesktop, USHORT fsType);

/* WinAlarm Codes */

#define WA_WARNING		0
#define WA_NOTE 		1
#define WA_ERROR		2
#define WA_CWINALARMS		3

USHORT APIENTRY WinMessageBox(HWND hwndParent, HWND hwndOwner, PSZ pszText,
                              PSZ pszCaption, USHORT idWindow, USHORT flStyle);

/* Message box types */

#define MB_OK			0x0000
#define MB_OKCANCEL		0x0001
#define MB_RETRYCANCEL		0x0002
#define MB_ABORTRETRYIGNORE	0x0003
#define MB_YESNO		0x0004
#define MB_YESNOCANCEL		0x0005
#define MB_CANCEL		0x0006
#define MB_ENTER		0x0007
#define MB_ENTERCANCEL		0x0008

#define MB_NOICON		0x0000
#define MB_CUANOTIFICATION	0x0000
#define MB_ICONQUESTION 	0x0010
#define MB_ICONEXCLAMATION	0x0020
#define MB_CUAWARNING		0x0020
#define MB_ICONASTERISK 	0x0030
#define MB_ICONHAND		0x0040
#define MB_CUACRITICAL		0x0040
#define MB_QUERY		MB_ICONQUESTION
#define MB_WARNING		MB_CUAWARNING
#define MB_INFORMATION		MB_ICONASTERISK
#define MB_CRITICAL		MB_CUACRITICAL
#define MB_ERROR		MB_CRITICAL

#define MB_DEFBUTTON1		0x0000
#define MB_DEFBUTTON2		0x0100
#define MB_DEFBUTTON3		0x0200

#define MB_APPLMODAL		0x0000
#define MB_SYSTEMMODAL		0x1000
#define MB_HELP 		0x2000
#define MB_MOVEABLE		0x4000


/* Message box return codes */

#define MBID_OK 		1
#define MBID_CANCEL		2
#define MBID_ABORT		3
#define MBID_RETRY		4
#define MBID_IGNORE		5
#define MBID_YES		6
#define MBID_NO 		7
#define MBID_HELP		8
#define MBID_ENTER		9
#define MBID_ERROR		0xffff

#endif /* Dialog Manager COMMON subsection */


#if (defined(INCL_WINDIALOGS) && !defined(INCL_WINDIALOGS_INCLUDED))
#define INCL_WINDIALOGS_INCLUDED

/* Dialog codes: returned by WM_QUERYDLGCODE msg     */

#define DLGC_ENTRYFIELD  0x0001 /* Entry field item understands EM_SETSEL) */
#define DLGC_BUTTON	 0x0002 /* Button item				   */
#define DLGC_RADIOBUTTON 0x0004 /* Radio button 			   */
#define DLGC_STATIC	 0x0008 /* Static item				   */
#define DLGC_DEFAULT	 0x0010 /* Default push button			   */
#define DLGC_PUSHBUTTON  0x0020 /* Normal (Non-default) push button	   */
#define DLGC_CHECKBOX	 0x0040 /* Check box button control		   */
#define DLGC_SCROLLBAR	 0x0080 /* Scroll bar				   */
#define DLGC_MENU	 0x0100 /* Menu 				   */
#define DLGC_TABONCLICK  0x0200
#define DLGC_MLE	 0x0400 /* Multiple Line Entry			   */


USHORT	APIENTRY WinProcessDlg(HWND hwndDlg);
USHORT	APIENTRY WinStartDlg(HWND hwndDlg);
MRESULT APIENTRY WinSendDlgItemMsg(HWND hwndDlg, USHORT idItem, USHORT msg,
				   MPARAM mp1, MPARAM mp2);
BOOL	APIENTRY WinMapDlgPoints(HWND hwndDlg, PPOINTL pptl, USHORT cwpt,
				 BOOL fCalcWindowCoords);
HWND	APIENTRY WinEnumDlgItem(HWND hwndDlg, HWND hwnd, USHORT code,
				BOOL fLock);
SHORT	APIENTRY WinSubstituteStrings(HWND hwnd, PSZ pszSrc, SHORT cchDstMax,
				      PSZ pszDst);

/* WinEnumDlgItem() constants
 *
 * In OS/2 1.2, WinEnumDlgItem() can enumerate a window such that the
 * selection cursor may be moved  according to CUA (Common User Access)
 * rules.
 */

#define EDI_FIRSTTABITEM	0
#define EDI_LASTTABITEM 	1
#define EDI_NEXTTABITEM 	2
#define EDI_PREVTABITEM 	3
#define EDI_FIRSTGROUPITEM	4
#define EDI_LASTGROUPITEM	5
#define EDI_NEXTGROUPITEM	6
#define EDI_PREVGROUPITEM	7

/*** Dialog template definitions */

/* Variable-sized dialog template items: */

typedef struct _DLGTITEM { /* dlgti */
	USHORT	fsItemStatus;
	USHORT	cChildren;
	USHORT	cchClassName;
	USHORT	offClassName;
	USHORT	cchText;
	USHORT	offText;
	ULONG	flStyle;
	SHORT	x;
	SHORT	y;
	SHORT	cx;
	SHORT	cy;
	USHORT	id;
	USHORT	offPresParams;
	USHORT	offCtlData;
} DLGTITEM;
typedef DLGTITEM FAR *PDLGTITEM;

/* Dialog Template structure */

typedef struct _DLGTEMPLATE { /* dlgt */
	USHORT	 cbTemplate;
	USHORT	 type;
	USHORT	 codepage;
	USHORT	 offadlgti;
	USHORT	 fsTemplateStatus;
	USHORT	 iItemFocus;
	USHORT	 coffPresParams;
	DLGTITEM adlgti[1];
} DLGTEMPLATE;
typedef DLGTEMPLATE FAR *PDLGTEMPLATE;

HWND APIENTRY WinCreateDlg(HWND hwndParent, HWND hwndOwner, PFNWP pfnDlgProc,
			   PDLGTEMPLATE pdlgt, PVOID pCreateParams);


#endif /* INCL_WINDIALOGS */


#if (defined(INCL_WINSTATICS) && !defined(INCL_WINSTATICS_INCLUDED))
#define INCL_WINSTATICS_INCLUDED

/*** Static Control Manager */

/* Static control styles:
 *
 * NOTE: the top 9 bits of the LOWORD of the window flStyle are used for
 * DT_* flags.  The lower 7 bits are for SS_* styles.  This gives us up
 * to 128 distinct static control types (we currently use 11 of them).
 */
#define SS_TEXT 		0x0001L
#define SS_GROUPBOX		0x0002L

#ifndef INCL_SAADEFS
#define SS_ICON 		0x0003L
#define SS_BITMAP		0x0004L
#endif /* !INCL_SAADEFS */
#define SS_FGNDRECT		0x0005L
#ifndef INCL_SAADEFS
#define SS_HALFTONERECT 	0x0006L
#endif /* !INCL_SAADEFS */
#define SS_BKGNDRECT		0x0007L
#define SS_FGNDFRAME		0x0008L
#ifndef INCL_SAADEFS
#define SS_HALFTONEFRAME	0x0009L
#endif /* !INCL_SAADEFS */
#define SS_BKGNDFRAME		0x000aL
#define SS_SYSICON		0x000bL

/* Static control class name */

#define WC_STATIC		((PSZ)0xffff0005L)

/* Static control messages */

#define SM_SETHANDLE		0x0100
#define SM_QUERYHANDLE		0x0101

#endif /* INCL_WINSTATICS */


#if (defined(INCL_WINBUTTONS) && !defined(INCL_WINBUTTONS_INCLUDED))
#define INCL_WINBUTTONS_INCLUDED
/**** Button Controls Subsection */

/* Button control styles */

#define BS_PUSHBUTTON		0L
#define BS_CHECKBOX		1L
#define BS_AUTOCHECKBOX 	2L
#define BS_RADIOBUTTON		3L
#define BS_AUTORADIOBUTTON	4L
#define BS_3STATE		5L
#define BS_AUTO3STATE		6L

#ifndef INCL_SAADEFS
#define BS_USERBUTTON		7L
#endif /* !INCL_SAADEFS */

#define BS_HELP 		0x0100L
#define BS_SYSCOMMAND		0x0200L
#define BS_DEFAULT		0x0400L
#define BS_NOPOINTERFOCUS	0x0800L
#define BS_NOBORDER		0x1000L
#define BS_NOCURSORSELECT	0x2000L


/* Button class name */

#define WC_BUTTON	 ((PSZ)0xffff0003L)


#ifndef INCL_SAADEFS
typedef struct _BTNCDATA { /* btncd */
	USHORT	cb;
	USHORT	fsCheckState;
	USHORT	fsHiliteState;
} BTNCDATA;
typedef BTNCDATA FAR *PBTNCDATA;
#endif /* !INCL_SAADEFS */

/* User button structure (passed in WM_CONTROL msg) */

#ifndef INCL_SAADEFS
typedef struct _USERBUTTON { /* ubtn */
	HWND	hwnd;
	HPS	hps;
	USHORT	fsState;
	USHORT	fsStateOld;
} USERBUTTON;
typedef USERBUTTON FAR *PUSERBUTTON;
#endif /* !INCL_SAADEFS */

/* Button control messages */

#define BM_CLICK		0x0120
#define BM_QUERYCHECKINDEX	0x0121
#define BM_QUERYHILITE		0x0122
#define BM_SETHILITE		0x0123
#define BM_QUERYCHECK		0x0124
#define BM_SETCHECK		0x0125
#define BM_SETDEFAULT		0x0126

/* Button notification codes */

#define BN_CLICKED		1
#define BN_DBLCLICKED		2
#define BN_PAINT		3

/* BN_PAINT button draw state codes (must be in high byte) */

#ifndef INCL_SAADEFS
#define BDS_HILITED		0x0100
#define BDS_DISABLED		0x0200
#define BDS_DEFAULT		0x0400

#endif /* !INCL_SAADEFS */

#endif /* INCL_WINBUTTONS */


#if (defined(INCL_WINENTRYFIELDS) && !defined(INCL_WINENTRYFIELDS_INCLUDED))
#define INCL_WINENTRYFIELDS_INCLUDED
/**** Entryfield controls Subsection */

/* Entry field  styles */

#define ES_LEFT 		0x00000000L
#define ES_CENTER		0x00000001L
#define ES_RIGHT		0x00000002L

#ifndef INCL_SAADEFS
#define ES_AUTOSCROLL		0x00000004L
#endif /* !INCL_SAADEFS */

#define ES_MARGIN		0x00000008L
#define ES_AUTOTAB		0x00000010L
#define ES_READONLY		0x00000020L
#define ES_COMMAND		0x00000040L
#define ES_UNREADABLE		0x00000080L
#define ES_PICTUREMASK		0x00000100L

#ifdef INCL_NLS
#define ES_ANY			0x00000000L
#define ES_SBCS 		0x00100000L
#define ES_DBCS 		0x00200000L
#define ES_MIXED		0x00300000L
#endif /* INCL_NLS */

#define WC_COMBOBOX		((PSZ)0xffff0002L)

/*
 * combo box styles
 */
#define CBS_SIMPLE		0x0001L
#define CBS_DROPDOWN		0x0002L
#define CBS_DROPDOWNLIST	0x0004L

#define CBM_SHOWLIST		0x0170L
#define CBM_HILITE		0x0171L
#define CBM_ISLISTSHOWING	0x0172L

#define CBN_EFCHANGE		1
#define CBN_EFSCROLL		2
#define CBN_MEMERROR		3
#define CBN_LBSELECT		4
#define CBN_LBSCROLL		5
#define CBN_SHOWLIST		6
#define CBN_ENTER		7

#define WC_ENTRYFIELD		((PSZ)0xffff0006L)

#ifndef INCL_SAADEFS
typedef struct _ENTRYFDATA { /* efd */
    USHORT  cb;
    USHORT  cchEditLimit;
    USHORT  ichMinSel;
    USHORT  ichMaxSel;
} ENTRYFDATA;
typedef ENTRYFDATA FAR *PENTRYFDATA;

#endif /* !INCL_SAADEFS */

/* Entry Field  messages */

#define EM_QUERYCHANGED 	0x0140
#define EM_QUERYSEL		0x0141
#define EM_SETSEL		0x0142
#define EM_SETTEXTLIMIT 	0x0143

#ifndef INCL_SAADEFS
#define EM_CUT			0x0144
#define EM_COPY 		0x0145
#endif /* !INCL_SAADEFS */
#define EM_CLEAR		0x0146
#ifndef INCL_SAADEFS
#define EM_PASTE		0x0147
#endif /* !INCL_SAADEFS */
#define EM_QUERYFIRSTCHAR	0x0148
#define EM_SETFIRSTCHAR 	0x0149
#ifndef INCL_SAADEFS
#define EM_QUERYREADONLY	0x014a
#define EM_SETREADONLY		0x014b
#define EM_SETINSERTMODE	0x014c
#endif /* !INCL_SAADEFS */

/* Entry Field notification messages */

#define EN_SETFOCUS		0x0001
#define EN_KILLFOCUS		0x0002
#define EN_CHANGE		0x0004
#define EN_SCROLL		0x0008
#ifndef INCL_SAADEFS
#define EN_MEMERROR		0x0010
#define EN_OVERFLOW		0x0020
#define EN_INSERTMODETOGGLE	0x0040
#endif /* !INCL_SAADEFS */

#endif /* INCL_WINENTRYFIELDS */


/*  Multiple Line Entrys */
#if (defined(INCL_WINMLE) && !defined(PMMLE_INCLUDED))
#define WC_MLE	((PSZ)0xffff000aL)
#include <pmmle.h>
#endif /* !INCL_WINMLE */

#if (defined(INCL_WINLISTBOXES) && !defined(INCL_WINLISTBOXES_INCLUDED))
#define INCL_WINLISTBOXES_INCLUDED

/**** Listboxes */

/* List box styles */

#define LS_MULTIPLESEL		0x00000001L

#ifndef INCL_SAADEFS
#define LS_OWNERDRAW		0x00000002L
#endif /* !INCL_SAADEFS */

#define LS_NOADJUSTPOS		0x00000004L
#define LS_HORZSCROLL		0x00000008L


/* Listbox class name */

#define WC_LISTBOX		((PSZ)0xffff0007L)

/* List box notification messages */

#define LN_SELECT		1
#define LN_SETFOCUS		2
#define LN_KILLFOCUS		3
#define LN_SCROLL		4
#define LN_ENTER		5

/* List box messages */

#define LM_QUERYITEMCOUNT	0x0160
#define LM_INSERTITEM		0x0161
#define LM_SETTOPINDEX		0x0162
#define LM_DELETEITEM		0x0163
#define LM_SELECTITEM		0x0164
#define LM_QUERYSELECTION	0x0165
#define LM_SETITEMTEXT		0x0166
#define LM_QUERYITEMTEXTLENGTH	0x0167
#define LM_QUERYITEMTEXT	0x0168

#define LM_SETITEMHANDLE	0x0169
#define LM_QUERYITEMHANDLE	0x016a
#define LM_SEARCHSTRING 	0x016b
#define LM_SETITEMHEIGHT	0x016c
#define LM_QUERYTOPINDEX	0x016d
#define LM_DELETEALL		0x016e

/* List box constants */

#define LIT_ERROR		(-3)
#define LIT_MEMERROR		(-2)
#define LIT_NONE		(-1)
#define LIT_FIRST		(-1)

/* For LM_INSERTITEM msg */

#define LIT_END 		(-1)
#define LIT_SORTASCENDING	(-2)
#define LIT_SORTDESCENDING	(-3)

/* For LM_SEARCHSTRING msg */

#define LSS_SUBSTRING		0x0001
#define LSS_PREFIX		0x0002
#define LSS_CASESENSITIVE	0x0004


#endif /* INCL_WINLISTBOXES */


#if (defined(INCL_WINMENUS) && !defined(INCL_WINMENUS_INCLUDED))
#define INCL_WINMENUS_INCLUDED

/**** Menu Manager Subsection */

/* Menu control styles */

#define MS_ACTIONBAR		0x00000001L
#define MS_TITLEBUTTON		0x00000002L
#define MS_VERTICALFLIP 	0x00000004L

HWND APIENTRY WinLoadMenu(HWND hwndFrame, HMODULE hmod, USHORT idMenu);

/* Menu class name */

#define WC_MENU              ((PSZ)0xffff0004L)

/* Menu control messages */

#define MM_INSERTITEM		0x0180
#define MM_DELETEITEM		0x0181
#define MM_QUERYITEM		0x0182
#define MM_SETITEM		0x0183
#define MM_QUERYITEMCOUNT	0x0184
#define MM_STARTMENUMODE	0x0185
#define MM_ENDMENUMODE		0x0186
#define MM_DISMISSMENU		0x0187
#define MM_REMOVEITEM		0x0188
#define MM_SELECTITEM		0x0189
#define MM_QUERYSELITEMID	0x018a
#define MM_QUERYITEMTEXT	0x018b
#define MM_QUERYITEMTEXTLENGTH	0x018c
#define MM_SETITEMHANDLE	0x018d
#define MM_SETITEMTEXT		0x018e
#define MM_ITEMPOSITIONFROMID	0x018f
#define MM_ITEMIDFROMPOSITION	0x0190
#define MM_QUERYITEMATTR	0x0191
#define MM_SETITEMATTR		0x0192
#define MM_ISITEMVALID		0x0193

HWND APIENTRY WinCreateMenu(HWND hwndParent, PVOID pvmt);

/* Owner Item Structure (Also used for listboxes) */

#ifndef INCL_SAADEFS
typedef struct _OWNERITEM { /* oi */
	HWND	hwnd;
	HPS	hps;
	USHORT	fsState;
	USHORT	fsAttribute;
	USHORT	fsStateOld;
	USHORT	fsAttributeOld;
	RECTL	rclItem;
	SHORT	idItem; /* This field contains idItem for menus, iItem for lb. */
	ULONG	hItem;
} OWNERITEM;
typedef OWNERITEM FAR *POWNERITEM;
#endif /* !INCL_SAADEFS */

/* Menu item */

typedef struct _MENUITEM { /* mi */
	SHORT	iPosition;
	USHORT	afStyle;
	USHORT	afAttribute;
	USHORT	id;
	HWND	hwndSubMenu;
	ULONG	hItem;
} MENUITEM;
typedef MENUITEM FAR *PMENUITEM;

#define MIT_END 		(-1)
#define MIT_NONE		(-1)
#define MIT_MEMERROR		(-1)
#define MIT_ERROR		(-1)
#define MID_NONE		MIT_NONE
#define MID_ERROR		(-1)

/* Menu item styles & attributes */

#define MIS_TEXT		0x0001

#ifndef INCL_SAADEFS
#define MIS_BITMAP		0x0002
#endif /* !INCL_SAADEFS */
#define MIS_SEPARATOR		0x0004

#ifndef INCL_SAADEFS
#define MIS_OWNERDRAW		0x0008
#endif /* !INCL_SAADEFS */

#define MIS_SUBMENU		0x0010
#define MIS_MULTMENU		0x0020	    /* multiple choice submenu	   */
#define MIS_SYSCOMMAND		0x0040
#define MIS_HELP		0x0080
#define MIS_STATIC		0x0100
#define MIS_BUTTONSEPARATOR	0x0200
#define MIS_BREAK		0x0400
#define MIS_BREAKSEPARATOR	0x0800
#define MIS_GROUP		0x1000	    /* multiple choice group start */
/* In multiple choice submenus a style of 'single' denotes the item is a
** radiobutton.  Absence of this style defaults the item to a checkbox.    */
#define MIS_SINGLE                 0x2000

#define MIA_NODISMISS		0x0020
#define MIA_FRAMED		0x1000
#define MIA_CHECKED		0x2000
#define MIA_DISABLED		0x4000
#define MIA_HILITED		0x8000

#endif /* INCL_WINMENUS */


#if (defined(INCL_WINSCROLLBARS) && !defined(INCL_WINSCROLLBARS_INCLUDED))
#define INCL_WINSCROLLBARS_INCLUDED

/*** Scroll Bar controls Subsection */

/* Scroll Bar styles */

#define SBS_HORZ		0L
#define SBS_VERT		1L
#define SBS_THUMBSIZE		2L
#define SBS_AUTOTRACK		4L

/* Scroll bar class name */


#define WC_SCROLLBAR         ((PSZ)0xffff0008L)

/* Scroll Bar messages */

#define SBM_SETSCROLLBAR	0x01a0
#define SBM_SETPOS		0x01a1
#define SBM_QUERYPOS		0x01a2
#define SBM_QUERYRANGE		0x01a3
#define SBM_SETHILITE		0x01a4
#define SBM_QUERYHILITE 	0x01a5
#define SBM_SETTHUMBSIZE	0x01a6

/* Scroll Bar Commands */

#define SB_LINEUP		1
#define SB_LINEDOWN		2
#define SB_LINELEFT		1
#define SB_LINERIGHT		2
#define SB_PAGEUP		3
#define SB_PAGEDOWN		4
#define SB_PAGELEFT		3
#define SB_PAGERIGHT		4
#define SB_SLIDERTRACK		5
#define SB_SLIDERPOSITION	6
#define SB_ENDSCROLL		7


#ifndef INCL_SAADEFS
typedef struct _SBCDATA { /* sbcd */
	USHORT	cb;
	USHORT	sHilite;      /* reserved, should be set to zero */
	SHORT	posFirst;
	SHORT	posLast;
	SHORT	posThumb;
	SHORT	cVisible;
	SHORT	cTotal;
} SBCDATA;
typedef SBCDATA FAR *PSBCDATA;
#endif /* !INCL_SAADEFS */

#endif /* INCL_WINSCROLLBARS */


#if ((defined(INCL_WINFRAMEMGR) || !defined(INCL_NOCOMMON)) && !defined(INCL_WINFRAMEMGR_INCLUDED))

/*** Frame Manager Common subsection */

typedef struct _FRAMECDATA { /* fcdata */
	USHORT	cb;
	ULONG	flCreateFlags;
	HMODULE hmodResources;
	USHORT	idResources;
} FRAMECDATA;
typedef FRAMECDATA FAR *PFRAMECDATA;

/* Frame window styles */

#define FCF_TITLEBAR		0x00000001L
#define FCF_SYSMENU		0x00000002L
#define FCF_MENU		0x00000004L
#define FCF_SIZEBORDER		0x00000008L
#define FCF_MINBUTTON		0x00000010L
#define FCF_MAXBUTTON		0x00000020L
#define FCF_MINMAX		0x00000030L /* minmax means BOTH buttons */
#define FCF_VERTSCROLL		0x00000040L
#define FCF_HORZSCROLL		0x00000080L
#define FCF_DLGBORDER		0x00000100L
#define FCF_BORDER		0x00000200L
#define FCF_SHELLPOSITION	0x00000400L
#define FCF_TASKLIST		0x00000800L
#define FCF_NOBYTEALIGN 	0x00001000L
#define FCF_NOMOVEWITHOWNER	0x00002000L
#define FCF_ICON		0x00004000L
#define FCF_ACCELTABLE		0x00008000L
#define FCF_SYSMODAL		0x00010000L
#define FCF_SCREENALIGN 	0x00020000L
#define FCF_MOUSEALIGN		0x00040000L
/* New values to enable multiple palettes.  Note that if none of the four  */
/* styles specified below are used then we default to the 'system' palette */
#define FCF_PALETTE_NORMAL	0x00080000L /* normal palette		   */
#define FCF_PALETTE_HELP	0x00100000L /* help palette		   */
#define FCF_PALETTE_POPUPODD	0x00200000L /* odd level popup palette	   */
#define FCF_PALETTE_POPUPEVEN	0x00400000L /* even level popup palette    */
/* FCF_ 0x00800000L is reserved */
#ifdef INCL_NLS
#define FCF_DBE_APPSTAT 	0x80000000L
#endif /* INCL_NLS */

/* FCF_TITLEBAR | FCF_SYSMENU | FCF_MENU | FCF_SIZEBORDER | FCF_MINMAX |
   FCF_ICON | FCF_ACCELTABLE | FCF_SHELLPOSITION | FCF_TASKLIST | FCF_PALETTE_NORMAL */
#define FCF_STANDARD		0x0008CC3FL


#define FS_ICON 		0x00000001L
#define FS_ACCELTABLE		0x00000002L

#ifndef INCL_SAADEFS
#define FS_SHELLPOSITION	0x00000004L
#endif /* !INCL_SAADEFS */

#define FS_TASKLIST		0x00000008L
#define FS_NOBYTEALIGN		0x00000010L
#define FS_NOMOVEWITHOWNER	0x00000020L
#define FS_SYSMODAL		0x00000040L
#define FS_DLGBORDER		0x00000080L
#define FS_BORDER		0x00000100L
#define FS_SCREENALIGN		0x00000200L
#define FS_MOUSEALIGN		0x00000400L
#define FS_SIZEBORDER		0x00000800L
#ifdef INCL_NLS
#define FS_DBE_APPSTAT		0x00008000L
#endif /* INCL_NLS */

/* FS_ICON | FS_ACCELTABLE | FS_SHELLPOSITION | FS_TASKLIST */
#define FS_STANDARD		0x0000000FL


/* Frame Window Flags accessed via WinSet/QueryWindowUShort(QWS_FLAGS) */

#ifndef INCL_SAADEFS
#define FF_FLASHWINDOW		0x0001
#define FF_ACTIVE		0x0002
#define FF_FLASHHILITE		0x0004
#define FF_OWNERHIDDEN		0x0008
#define FF_DLGDISMISSED 	0x0010
#define FF_OWNERDISABLED	0x0020
#define FF_SELECTED		0x0040
#define FF_NOACTIVATESWP	0x0080
#endif /* !INCL_SAADEFS */


HWND APIENTRY WinCreateStdWindow(HWND hwndParent, ULONG flStyle,
				 PULONG pflCreateFlags, PSZ pszClientClass,
				 PSZ pszTitle, ULONG flClientStyle,
				 HMODULE hmod, USHORT idResources,
				 PHWND phwndClient);


#endif /* Frame Manager Common subsection */


#if (defined(INCL_WINFRAMEMGR) && !defined(INCL_WINFRAMEMGR_INCLUDED))
#define INCL_WINFRAMEMGR_INCLUDED

BOOL  APIENTRY WinFlashWindow(HWND hwndFrame, BOOL fFlash);

/* Frame window related messages */

#define WM_FLASHWINDOW		0x0040
#define WM_FORMATFRAME		0x0041
#define WM_UPDATEFRAME		0x0042
#define WM_FOCUSCHANGE		0x0043

#define WM_SETBORDERSIZE	0x0044
#define WM_TRACKFRAME		0x0045
#define WM_MINMAXFRAME		0x0046
#define WM_SETICON		0x0047
#define WM_QUERYICON		0x0048
#define WM_SETACCELTABLE	0x0049
#define WM_QUERYACCELTABLE	0x004a
#define WM_TRANSLATEACCEL	0x004b
#define WM_QUERYTRACKINFO	0x004c
#define WM_QUERYBORDERSIZE	0x004d
#define WM_NEXTMENU		0x004e
#define WM_ERASEBACKGROUND	0x004f
#define WM_QUERYFRAMEINFO	0x0050
/* Note 0x0051/5 are reserved */
#define WM_QUERYFOCUSCHAIN	0x0051
#define WM_CALCFRAMERECT	0x0053
#define WM_WINDOWPOSCHANGED	0x0055
#define WM_QUERYFRAMECTLCOUNT	0x0059
#ifndef INCL_SAADEFS
/* Note 0x005A is reserved */
#define WM_QUERYHELPINFO	0x005B
#define WM_SETHELPINFO		0x005C
#define WM_ERROR		0x005D


/* WM_QUERYFRAMEINFO constants */

#define FI_FRAME		0x00000001L
#define FI_OWNERHIDE		0x00000002L
#define FI_ACTIVATEOK		0x00000004L
#define FI_NOMOVEWITHOWNER	0x00000008L


#endif /* !INCL_SAADEFS */

/* Frame class name */

#define WC_FRAME		((PSZ)0xffff0001L)

BOOL  APIENTRY WinCreateFrameControls(HWND hwndFrame, PFRAMECDATA pfcdata,
				      PSZ pszTitle);

BOOL  APIENTRY WinCalcFrameRect(HWND hwndFrame, PRECTL prcl, BOOL fClient);

BOOL  APIENTRY WinGetMinPosition(HWND hwnd, PSWP pswp, PPOINTL pptl);
#ifndef INCL_SAADEFS
BOOL  APIENTRY WinGetMaxPosition(HWND hwnd, PSWP pswp);
#endif /* !INCL_SAADEFS */

#ifndef INCL_SAADEFS
SHORT APIENTRY WinFormatFrame(HWND hwndFrame, PRECTL prclFrame, PSWP pswp,
                              USHORT cswpMax, PRECTL prclClient);
#endif /* !INCL_SAADEFS */

/* Frame control IDs    */

#define FID_SYSMENU		0x8002
#define FID_TITLEBAR		0x8003
#define FID_MINMAX		0x8004
#define FID_MENU		0x8005
#define FID_VERTSCROLL		0x8006
#define FID_HORZSCROLL		0x8007
#define FID_CLIENT		0x8008
/* Note 0x8009 is reserved */
#define FID_DBE_APPSTAT 	0x8010
#define FID_DBE_KBDSTAT 	0x8011
#define FID_DBE_PECIC		0x8012
#define FID_DBE_KKPOPUP 	0x8013

/* Standard WM_SYSCOMMAND command values */

#define SC_SIZE 		0x8000
#define SC_MOVE 		0x8001
#define SC_MINIMIZE		0x8002
#define SC_MAXIMIZE		0x8003
#define SC_CLOSE		0x8004
#define SC_NEXT 		0x8005
#define SC_APPMENU		0x8006
#define SC_SYSMENU		0x8007
#define SC_RESTORE		0x8008
#define SC_NEXTFRAME		0x8009
#define SC_NEXTWINDOW		0x8010
#ifndef INCL_SAADEFS
#define SC_TASKMANAGER		0x8011
#define SC_HELPKEYS		0x8012
#define SC_HELPINDEX		0x8013
#define SC_HELPEXTENDED 	0x8014
#define SC_SWITCHPANELIDS	0x8015
#define SC_DBE_FIRST		0x8018
#define SC_DBE_LAST		0x801F

#endif /* !INCL_SAADEFS */

#endif /* INCL_WINFRAMEMGR */

/*** Frame controls */

#if (defined(INCL_WINFRAMECTLS) && !defined(INCL_WINFRAMECTLS_INCLUDED))
#define INCL_WINFRAMECTLS_INCLUDED

/** Title bar controls */

/* Title bar control class name */

#define WC_TITLEBAR		((PSZ)0xffff0009L)

/* Title bar control messages */

#define TBM_SETHILITE		0x01e3
#define TBM_QUERYHILITE 	0x01e4
#define TBM_TRACKMOVE		0x01e5

#endif /* INCL_WINFRAMECTLS */

#if (defined(INCL_WINRECTANGLES) && !defined(INCL_WINRECTANGLES_INCLUDED))
#define INCL_WINRECTANGLES_INCLUDED
/*** Rectangle routines */

BOOL APIENTRY WinCopyRect(HAB hab, PRECTL prclDst, PRECTL prclSrc);

#ifndef INCL_SAADEFS
BOOL APIENTRY WinSetRect(HAB hab, PRECTL prcl, SHORT xLeft, SHORT yBottom,
			 SHORT xRight, SHORT yTop);
BOOL APIENTRY WinIsRectEmpty(HAB hab, PRECTL prcl);
BOOL APIENTRY WinEqualRect(HAB hab, PRECTL prcl1, PRECTL prcl2);
BOOL APIENTRY WinSetRectEmpty(HAB hab, PRECTL prcl);
BOOL APIENTRY WinOffsetRect(HAB hab, PRECTL prcl, SHORT cx, SHORT cy);
BOOL APIENTRY WinInflateRect(HAB hab, PRECTL prcl, SHORT cx, SHORT cy);
BOOL APIENTRY WinPtInRect(HAB hab, PRECTL prcl, PPOINTL pptl);
BOOL APIENTRY WinIntersectRect(HAB hab, PRECTL prclDst, PRECTL prclSrc1,
			       PRECTL prclSrc2);
BOOL APIENTRY WinUnionRect(HAB hab, PRECTL prclDst, PRECTL prclSrc1,
			   PRECTL prclSrc2);
BOOL APIENTRY WinSubtractRect(HAB hab, PRECTL prclDst, PRECTL prclSrc1,
			      PRECTL prclSrc2);
#endif /* !INCL_SAADEFS */

#endif /* INCL_WINRECTANGLES */


#if (defined(INCL_WINSYS) && !defined(INCL_WINSYS_INCLUDED))
#define INCL_WINSYS_INCLUDED

/*** System values */

LONG APIENTRY WinQuerySysValue(HWND hwndDesktop, SHORT iSysValue);
BOOL  APIENTRY WinSetSysValue(HWND hwndDesktop, SHORT iSysValue, LONG lValue);

#define SV_SWAPBUTTON		0
#define SV_DBLCLKTIME		1
#define SV_CXDBLCLK		2
#define SV_CYDBLCLK		3
#define SV_CXSIZEBORDER 	4
#define SV_CYSIZEBORDER 	5
#define SV_ALARM		6

#ifndef INCL_SAADEFS
#define SV_RESERVEDFIRST1	7
#define SV_RESERVEDLAST1	8
#endif /* !INCL_SAADEFS */

#define SV_CURSORRATE		9
#define SV_FIRSTSCROLLRATE	10
#define SV_SCROLLRATE		11
#define SV_NUMBEREDLISTS	12
#define SV_WARNINGFREQ		13
#define SV_NOTEFREQ		14
#define SV_ERRORFREQ		15
#define SV_WARNINGDURATION	16
#define SV_NOTEDURATION 	17
#define SV_ERRORDURATION	18

#ifndef INCL_SAADEFS
#define SV_RESERVEDFIRST	19
#define SV_RESERVEDLAST 	19
#endif /* !INCL_SAADEFS */

#define SV_CXSCREEN		20
#define SV_CYSCREEN		21
#define SV_CXVSCROLL		22
#define SV_CYHSCROLL		23
#define SV_CYVSCROLLARROW	24
#define SV_CXHSCROLLARROW	25
#define SV_CXBORDER		26
#define SV_CYBORDER		27
#define SV_CXDLGFRAME		28
#define SV_CYDLGFRAME		29
#define SV_CYTITLEBAR		30
#define SV_CYVSLIDER		31
#define SV_CXHSLIDER		32
#define SV_CXMINMAXBUTTON	33
#define SV_CYMINMAXBUTTON	34
#define SV_CYMENU		35
#define SV_CXFULLSCREEN 	36
#define SV_CYFULLSCREEN 	37
#define SV_CXICON		38
#define SV_CYICON		39
#define SV_CXPOINTER		40
#define SV_CYPOINTER		41

#define SV_DEBUG		42
#define SV_CMOUSEBUTTONS	43
#define SV_POINTERLEVEL 	44
#define SV_CURSORLEVEL		45
#define SV_TRACKRECTLEVEL	46

#ifndef INCL_SAADEFS
#define SV_CTIMERS		47
#endif /* !INCL_SAADEFS */

#define SV_MOUSEPRESENT 	48

#define SV_CXBYTEALIGN		49
#define SV_CYBYTEALIGN		50

/* The following value enables any greater value to be set by WinSetSysVlaue. */
/* Values of 51-55 are spare for extra non-settable system values             */
/* This is to enable the setting of SV_EXTRAKEYBEEP by applications.          */

#define SV_NOTRESERVED		56
#define SV_EXTRAKEYBEEP 	57

/* The following system value controls whether PM controls the keyboard      */
/* lights for light key keystrokes (else applications will)                  */
#define SV_SETLIGHTS		58
#define SV_INSERTMODE		59


#define SV_MENUROLLDOWNDELAY	64
#define SV_MENUROLLUPDELAY	65
#define SV_ALTMNEMONIC		66
#define SV_TASKLISTMOUSEACCESS	67
/* The following is the total number of system values */
#define SV_CSYSVALUES		68

#define SV_CPOINTERBUTTONS	69
#define SV_CXALIGN		70
#define SV_CYALIGN		71
#define SV_MNEMONICSENABLED	72

/*
 * Presentation parameter structures.
 */
typedef struct _PARAM { /* param */
	ULONG	id;
	ULONG	cb;
	BYTE	ab[1];
} PARAM;
typedef PARAM NEAR *NPPARAM;
typedef PARAM FAR  *PPARAM;

typedef struct _PRESPARAMS { /* pres */
	ULONG	cb;
	PARAM	aparam[1];
} PRESPARAMS;
typedef PRESPARAMS NEAR *NPPRESPARAMS;
typedef PRESPARAMS FAR  *PPRESPARAMS;


/*
 * Presentation parameter APIs
 */
BOOL  APIENTRY WinSetPresParam(HWND hwnd, ULONG id, ULONG cbParam,
			       PVOID pbParam);
ULONG APIENTRY WinQueryPresParam(HWND hwnd, ULONG id1, ULONG id2,
				 PULONG pulId, ULONG cbBuf, PVOID pbBuf,
				 USHORT fs);
BOOL  APIENTRY WinRemovePresParam(HWND hwnd, ULONG id);

/*
 * Presentation parameter types.
 */

#define PP_FOREGROUNDCOLOR		 1L
#define PP_FOREGROUNDCOLORINDEX 	 2L
#define PP_BACKGROUNDCOLOR		 3L
#define PP_BACKGROUNDCOLORINDEX 	 4L
#define PP_HILITEFOREGROUNDCOLOR	 5L
#define PP_HILITEFOREGROUNDCOLORINDEX	 6L
#define PP_HILITEBACKGROUNDCOLOR	 7L
#define PP_HILITEBACKGROUNDCOLORINDEX	 8L
#define PP_DISABLEDFOREGROUNDCOLOR	 9L
#define PP_DISABLEDFOREGROUNDCOLORINDEX  10L
#define PP_DISABLEDBACKGROUNDCOLOR	 11L
#define PP_DISABLEDBACKGROUNDCOLORINDEX  12L
#define PP_BORDERCOLOR			 13L
#define PP_BORDERCOLORINDEX		 14L
#define PP_FONTNAMESIZE 		 15L
#define PP_FONTHANDLE			 16L

/*
 * Flags for WinQueryPresParams()
 */
#define QPF_NOINHERIT	   0x0001 /* Don't inherit                      */
#define QPF_ID1COLORINDEX  0x0002 /* Convert id1 color index into RGB	*/
#define QPF_ID2COLORINDEX  0x0004 /* Convert id2 color index into RGB	*/
#define QPF_PURERGBCOLOR   0x0008 /* Return pure RGB colors		*/
#define QPF_VALIDFLAGS	   0x000F /* Valid WinQueryPresParams() flags.	*/

/*** System color functions */

LONG APIENTRY WinQuerySysColor(HWND hwndDesktop, COLOR clr, LONG lReserved);
BOOL APIENTRY WinSetSysColors(HWND hwndDesktop, ULONG flOptions,
			      ULONG flFormat, COLOR clrFirst, ULONG cclr,
			      PCOLOR pclr);
#define SYSCLR_BUTTONLIGHT		(-41L)
#define SYSCLR_BUTTONMIDDLE		(-40L)
#define SYSCLR_BUTTONDARK		(-39L)
#define SYSCLR_BUTTONDEFAULT		(-38L)
#define SYSCLR_TITLEBOTTOM		(-37L)
#define SYSCLR_SHADOW			(-36L)
#define SYSCLR_ICONTEXT 		(-35L)
#define SYSCLR_DIALOGBACKGROUND 	(-34L)
#define SYSCLR_HILITEFOREGROUND 	(-33L)
#define SYSCLR_HILITEBACKGROUND 	(-32L)
#define SYSCLR_INACTIVETITLETEXTBGND	(-31L)
#define SYSCLR_ACTIVETITLETEXTBGND	(-30L)
#define SYSCLR_INACTIVETITLETEXT	(-29L)
#define SYSCLR_ACTIVETITLETEXT		(-28L)
#define SYSCLR_OUTPUTTEXT		(-27L)
#define SYSCLR_WINDOWSTATICTEXT 	(-26L)
#define SYSCLR_SCROLLBAR		(-25L)
#define SYSCLR_BACKGROUND		(-24L)
#define SYSCLR_ACTIVETITLE		(-23L)
#define SYSCLR_INACTIVETITLE		(-22L)
#define SYSCLR_MENU			(-21L)
#define SYSCLR_WINDOW			(-20L)
#define SYSCLR_WINDOWFRAME		(-19L)
#define SYSCLR_MENUTEXT 		(-18L)
#define SYSCLR_WINDOWTEXT		(-17L)
#define SYSCLR_TITLETEXT		(-16L)
#define SYSCLR_ACTIVEBORDER		(-15L)
#define SYSCLR_INACTIVEBORDER		(-14L)
#define SYSCLR_APPWORKSPACE		(-13L)
#define SYSCLR_HELPBACKGROUND		(-12L)
#define SYSCLR_HELPTEXT 		(-11L)
#define SYSCLR_HELPHILITE		(-10L)

#define SYSCLR_CSYSCOLORS		32L

#endif /* INCL_WINSYS */


#if (defined(INCL_WINTIMER) && !defined(INCL_WINTIMER_INCLUDED))
#define INCL_WINTIMER_INCLUDED
/**** Timer manager */

#ifndef INCL_SAADEFS
USHORT APIENTRY WinStartTimer(HAB hab, HWND hwnd, USHORT idTimer,
			      USHORT dtTimeout);
BOOL   APIENTRY WinStopTimer(HAB hab, HWND hwnd, USHORT idTimer);
ULONG  APIENTRY WinGetCurrentTime(HAB hab);

#define TID_CURSOR	 0xffff  /* Reserved cursor timer ID		  */
#define TID_SCROLL	 0xfffe  /* Reserved scrolling timer ID 	  */
#define TID_FLASHWINDOW  0xfffd  /* Reserved for window flashing timer ID */
#define TID_USERMAX	 0x7fff  /* Maximum user timer ID		  */
#endif /* !INCL_SAADEFS */

#endif /* INCL_WINTIMER */


#if (defined(INCL_WINACCELERATORS) && !defined(INCL_WINACCELERATORS_INCLUDED))
#define INCL_WINACCELERATORS_INCLUDED
/**** Accelerator functions */

/* ACCEL fs bits
 *
 * NOTE: the first six AF_ code bits have the same value
 * as their KC_ counterparts
 */
#ifndef INCL_SAADEFS
#define AF_CHAR 		0x0001
#define AF_VIRTUALKEY		0x0002
#define AF_SCANCODE		0x0004
#define AF_SHIFT		0x0008
#define AF_CONTROL		0x0010
#define AF_ALT			0x0020
#define AF_LONEKEY		0x0040
#define AF_SYSCOMMAND		0x0100
#define AF_HELP 		0x0200
#endif /* !INCL_SAADEFS */

typedef LHANDLE HACCEL; /* haccel */

typedef struct _ACCEL { /* acc */
	USHORT	fs;
	USHORT	key;
	USHORT	cmd;
} ACCEL;
typedef ACCEL FAR *PACCEL;

typedef struct _ACCELTABLE { /* acct  */
	USHORT	cAccel;
	USHORT	codepage;
	ACCEL	aaccel[1];
} ACCELTABLE;
typedef ACCELTABLE FAR *PACCELTABLE;

HACCEL APIENTRY WinLoadAccelTable(HAB hab, HMODULE hmod, USHORT idAccelTable);
HACCEL APIENTRY WinCreateAccelTable(HAB hab, PACCELTABLE pacct);
BOOL   APIENTRY WinDestroyAccelTable(HACCEL haccel);
USHORT APIENTRY WinCopyAccelTable(HACCEL haccel, PACCELTABLE pacct,
				  USHORT cbCopyMax);
BOOL   APIENTRY WinTranslateAccel(HAB hab, HWND hwnd, HACCEL haccel,
				  PQMSG pqmsg);
BOOL   APIENTRY WinSetAccelTable(HAB hab, HACCEL haccel, HWND hwndFrame);
HACCEL APIENTRY WinQueryAccelTable(HAB hab, HWND hwndFrame);

#endif /* INCL_WINACCELERATORS */

/**** Extended Attribute Flags (Association Table) */

#define EAF_DEFAULTOWNER	0x0001
#define EAF_UNCHANGEABLE	0x0002
#define EAF_REUSEICON		0x0004

/*** WinTrackRect() information */

#if (defined(INCL_WINTRACKRECT) && !defined(INCL_WINTRACKRECT_INCLUDED))
#define INCL_WINTRACKRECT_INCLUDED

/* WinTrackRect() tracking information structure */

typedef struct _TRACKINFO { /* ti */
	SHORT	cxBorder;
	SHORT	cyBorder;
	SHORT	cxGrid;
	SHORT	cyGrid;
	SHORT	cxKeyboard;
	SHORT	cyKeyboard;
	RECTL	rclTrack;
	RECTL	rclBoundary;
	POINTL	ptlMinTrackSize;
	POINTL	ptlMaxTrackSize;
	USHORT	fs;
} TRACKINFO;
typedef TRACKINFO FAR *PTRACKINFO;

#ifndef INCL_SAADEFS
BOOL APIENTRY WinTrackRect(HWND hwnd, HPS hps, PTRACKINFO pti);
BOOL APIENTRY WinShowTrackRect(HWND hwnd, BOOL fShow);

/* WinTrackRect() flags */

#define TF_LEFT 		0x0001
#define TF_TOP			0x0002
#define TF_RIGHT		0x0004
#define TF_BOTTOM		0x0008
/* TF_MOVE = TF_LEFT | TF_TOP | TF_RIGHT | TF_BOTTOM */
#define TF_MOVE 		0x000F

#define TF_SETPOINTERPOS	0x0010
#define TF_GRID 		0x0020
#define TF_STANDARD		0x0040
#define TF_ALLINBOUNDARY	0x0080
#define TF_VALIDATETRACKRECT	0x0100
#define TF_PARTINBOUNDARY	0x0200

#endif /* !INCL_SAADEFS */

#endif /* INCL_WINTRACKRECT */


/**** Clipboard Manager */

#if (defined(INCL_WINCLIPBOARD) && !defined(INCL_WINCLIPBOARD_INCLUDED))
#define INCL_WINCLIPBOARD_INCLUDED

/* Clipboard messages */

#ifndef INCL_SAADEFS
#define WM_RENDERFMT		0x0060
#define WM_RENDERALLFMTS	0x0061
#define WM_DESTROYCLIPBOARD	0x0062
#define WM_PAINTCLIPBOARD	0x0063
#define WM_SIZECLIPBOARD	0x0064
#define WM_HSCROLLCLIPBOARD	0x0065
#define WM_VSCROLLCLIPBOARD	0x0066
#define WM_DRAWCLIPBOARD	0x0067

/* Standard Clipboard formats */

#define CF_TEXT 		1
#define CF_BITMAP		2
#define CF_DSPTEXT		3
#define CF_DSPBITMAP		4
#define CF_METAFILE		5
#define CF_DSPMETAFILE		6

BOOL  APIENTRY WinSetClipbrdOwner(HAB hab, HWND hwnd);
BOOL  APIENTRY WinSetClipbrdData(HAB hab, ULONG ulData, USHORT fmt,
				 USHORT fsFmtInfo);
ULONG APIENTRY WinQueryClipbrdData(HAB hab, USHORT fmt);
BOOL  APIENTRY WinQueryClipbrdFmtInfo(HAB hab, USHORT fmt,
				      PUSHORT pfsFmtInfo);
BOOL  APIENTRY WinSetClipbrdViewer(HAB hab, HWND hwndNewClipViewer);

/* WinSetClipbrdData() flags */

#define CFI_OWNERFREE		0x0001
#define CFI_OWNERDISPLAY	0x0002
#define CFI_SELECTOR		0x0100
#define CFI_HANDLE		0x0200

#endif /* !INCL_SAADEFS */

USHORT APIENTRY WinEnumClipbrdFmts(HAB hab, USHORT fmt);
BOOL   APIENTRY WinEmptyClipbrd(HAB hab);
BOOL   APIENTRY WinOpenClipbrd(HAB hab);
BOOL   APIENTRY WinCloseClipbrd(HAB hab);
HWND   APIENTRY WinQueryClipbrdOwner(HAB hab, BOOL fLock);
HWND   APIENTRY WinQueryClipbrdViewer(HAB hab, BOOL fLock);

#endif /* INCL_WINCLIPBOARD */


#if (defined(INCL_WINCURSORS) || !defined(INCL_NOCOMMON))
/**** Cursor manager common subsection */

BOOL APIENTRY WinDestroyCursor(HWND hwnd);
BOOL APIENTRY WinShowCursor(HWND hwnd, BOOL fShow);
BOOL APIENTRY WinCreateCursor(HWND hwnd, SHORT x, SHORT y, SHORT cx,
			      SHORT cy, USHORT fs, PRECTL prclClip);

/* WinCreateCursor() flags */

#define CURSOR_SOLID		0x0000
#define CURSOR_HALFTONE 	0x0001
#define CURSOR_FRAME		0x0002
#define CURSOR_FLASH		0x0004
#define CURSOR_SETPOS		0x8000


#endif /* Cursor manager common subsection */

#if (defined(INCL_WINCURSORS) && !defined(INCL_WINCURSORS_INCLUDED))
#define INCL_WINCURSORS_INCLUDED

typedef struct _CURSORINFO { /* csri */
	HWND	hwnd;
	SHORT	x;
	SHORT	y;
	SHORT	cx;
	SHORT	cy;
	USHORT	fs;
	RECTL	rclClip;
} CURSORINFO;
typedef CURSORINFO FAR *PCURSORINFO;

BOOL APIENTRY WinQueryCursorInfo(HWND hwndDesktop, PCURSORINFO pcsri);

#endif /* INCL_WINCURSORS */

typedef LHANDLE HPOINTER;   /* hptr */

#if (defined(INCL_WINPOINTERS) && !defined(INCL_WINPOINTERS_INCLUDED))
#define INCL_WINPOINTERS_INCLUDED
/**** Pointer manager */

BOOL     APIENTRY WinSetPointer(HWND hwndDesktop, HPOINTER hptrNew);
BOOL     APIENTRY WinShowPointer(HWND hwndDesktop, BOOL fShow);
HPOINTER APIENTRY WinQuerySysPointer(HWND hwndDesktop, SHORT iptr, BOOL fLoad);


/* System pointers (NOTE: these are 1-based) */

#ifdef LATER

#define SPTR_ARROW		1
#define SPTR_TEXT		2
#define SPTR_WAIT		3
#define SPTR_MOVE		4
#define SPTR_SIZENWSE		5
#define SPTR_SIZENESW		6
#define SPTR_SIZEWE		7
#define SPTR_SIZENS		8
#define SPTR_APPICON		9

#define SPTR_ICONINFORMATION	10
#define SPTR_ICONQUESTION	11
#define SPTR_ICONERROR		12
#define SPTR_ICONWARNING	13

#define SPTR_CPTR		13    /* Count of pointers loaded by PMWIN */

#define SPTR_ILLEGAL		14
#define SPTR_FILE		15
#define SPTR_FOLDER		16
#define SPTR_MULTFILE		17
#define SPTR_PROGRAM		18

#else

#define SPTR_ARROW		1
#define SPTR_TEXT		2
#define SPTR_WAIT		3
#define SPTR_SIZE		4
#define SPTR_MOVE		5
#define SPTR_SIZENWSE		6
#define SPTR_SIZENESW		7
#define SPTR_SIZEWE		8
#define SPTR_SIZENS		9
#define SPTR_APPICON		10
#define SPTR_ICONINFORMATION	11
#define SPTR_ICONQUESTION	12
#define SPTR_ICONERROR		13
#define SPTR_ICONWARNING	14
#define SPTR_CPTR		14	/* count loaded by pmwin */

#define SPTR_ILLEGAL		18
#define SPTR_FILE		19
#define SPTR_FOLDER		20
#define SPTR_MULTFILE		21
#define SPTR_PROGRAM		22

/* backward compatibility */
#define SPTR_HANDICON		SPTR_ICONERROR
#define SPTR_QUESICON		SPTR_ICONQUESTION
#define SPTR_BANGICON		SPTR_ICONWARNING
#define SPTR_NOTEICON		SPTR_ICONINFORMATION

#endif /* LATER */

HPOINTER APIENTRY WinLoadPointer(HWND hwndDesktop, HMODULE hmod,
				 USHORT idPtr);
BOOL	 APIENTRY WinDestroyPointer(HPOINTER hptr);
HPOINTER APIENTRY WinCreatePointer(HWND hwndDesktop, HBITMAP hbmPointer,
				   BOOL fPointer, SHORT xHotspot,
				   SHORT yHotspot);

HPOINTER APIENTRY WinQueryPointer(HWND hwndDesktop);
BOOL     APIENTRY WinSetPointerPos(HWND hwndDesktop, SHORT x, SHORT y);
BOOL     APIENTRY WinQueryPointerPos(HWND hwndDesktop, PPOINTL pptl);

typedef struct _POINTERINFO { /* ptri */
	BOOL	fPointer;
	SHORT	xHotspot;
	SHORT	yHotspot;
	HBITMAP hbmPointer;
	HBITMAP hbmColor;
} POINTERINFO;
typedef POINTERINFO FAR *PPOINTERINFO;

HPOINTER APIENTRY WinCreatePointerIndirect(HWND hwndDesktop,
					   PPOINTERINFO pptri);
BOOL	 APIENTRY WinQueryPointerInfo(HPOINTER hptr,
				      PPOINTERINFO pptri);
BOOL	 APIENTRY WinDrawPointer(HPS hps, SHORT x, SHORT y, HPOINTER hptr,
				 USHORT fs);



/* WinDrawPointer() constants */

#define DP_NORMAL		0x0000
#define DP_HALFTONED		0x0001
#define DP_INVERTED		0x0002


HBITMAP APIENTRY WinGetSysBitmap(HWND hwndDesktop, USHORT ibm);

/* System bitmaps (NOTE: these are 1-based) */

#define SBMP_OLD_SYSMENU	1
#define SBMP_OLD_SBUPARROW	2
#define SBMP_OLD_SBDNARROW	3
#define SBMP_OLD_SBRGARROW	4
#define SBMP_OLD_SBLFARROW	5
#define SBMP_MENUCHECK		6
#define SBMP_CHECKBOXES 	7
#define SBMP_BTNCORNERS 	8
#define SBMP_OLD_MINBUTTON	9
#define SBMP_OLD_MAXBUTTON	10
#define SBMP_OLD_RESTOREBUTTON	11
#define SBMP_OLD_CHILDSYSMENU	12
#define SBMP_DRIVE		15
#define SBMP_FILE		16
#define SBMP_FOLDER		17
#define SBMP_TREEPLUS		18
#define SBMP_TREEMINUS		19
#define SBMP_PROGRAM		22
#define SBMP_MENUATTACHED	23
#define SBMP_SIZEBOX		24

#define SBMP_SYSMENU		25
#define SBMP_MINBUTTON		26
#define SBMP_MAXBUTTON		27
#define SBMP_RESTOREBUTTON	28
#define SBMP_CHILDSYSMENU	29
#define SBMP_SYSMENUDEP 	30
#define SBMP_MINBUTTONDEP	31
#define SBMP_MAXBUTTONDEP	32
#define SBMP_RESTOREBUTTONDEP	33
#define SBMP_CHILDSYSMENUDEP	34
#define SBMP_SBUPARROW		35
#define SBMP_SBDNARROW		36
#define SBMP_SBLFARROW		37
#define SBMP_SBRGARROW		38
#define SBMP_SBUPARROWDEP	39
#define SBMP_SBDNARROWDEP	40
#define SBMP_SBLFARROWDEP	41
#define SBMP_SBRGARROWDEP	42
#define SBMP_SBUPARROWDIS	43
#define SBMP_SBDNARROWDIS	44
#define SBMP_SBLFARROWDIS	45
#define SBMP_SBRGARROWDIS	46
#define SBMP_COMBODOWN		47

#endif /* INCL_WINPOINTERS */


/**** Hook manager */

#if (defined(INCL_WINHOOKS) && !defined(INCL_WINHOOKS_INCLUDED))
#define INCL_WINHOOKS_INCLUDED

#ifndef INCL_SAADEFS
BOOL APIENTRY WinSetHook(HAB hab, HMQ hmq, SHORT iHook, PFN pfnHook,
			 HMODULE hmod);
BOOL APIENTRY WinReleaseHook(HAB hab, HMQ hmq, SHORT iHook, PFN pfnHook,
			     HMODULE hmod);
BOOL APIENTRY WinCallMsgFilter(HAB hab, PQMSG pqmsg, USHORT msgf);


/* Hook codes */

#define HK_SENDMSG		   0
    /* VOID EXPENTRY SendMsgHook(HAB hab,		** installer's hab      **
				 PSMHSTRUCT psmh,	** p send msg struct	**
				 BOOL fInterTask);	** between threads	*/
#define HK_INPUT		   1
    /* BOOL EXPENTRY InputHook(HAB hab, 		** installer's hab      **
			       PQMSG pQmsg,		** p qmsg		**
			       USHORT fs);		** remove/noremove	*/
#define HK_MSGFILTER		   2
    /* BOOL EXPENTRY MsgFilterHook(HAB hab,		** installer's hab      **
				   PQMSG pQmsg, 	** p qmsg		**
				   USHORT msgf);	** filter flag		*/
#define HK_JOURNALRECORD	   3
    /* VOID EXPENTRY JournalRecordHook(HAB hab, 	** installer's hab      **
                                       PQMSG pQmsg);    ** p qmsg               */
#define HK_JOURNALPLAYBACK	   4
    /* ULONG EXPENTRY JournalPlaybackHook(HAB hab,	**installer's hab       **
					  BOOL fSkip,	** skip messages	**
					  PQMSG pQmsg); ** p qmsg		*/
#define HK_HELP 		   5
    /* BOOL EXPENTRY HelpHook(HAB hab,			** installer's hab      **
			      USHORT usMode,		** mode 		**
			      USHORT idTopic,		** main topic		**
			      USHORT idSubTopic,	** sub topic		**
			      PRECTL prcPosition);	** associated position	*/

#define HK_LOADER		   6
    /* BOOL EXPENTRY LoaderHook(HAB hab,		** installer's hab      **
				SHORT idContext,	** who called hook	**
				PSZ pszLibname, 	** lib name string	**
				PHLIB hlib,		** p to lib handle	**
				PSZ pszProcname,	** procedure name	**
				PFNWP wndProc); 	** window procedure	*/
#define HK_REGISTERUSERMSG	   7
    /* BOOL EXPENTRY RegisterUserHook(HAB hab,		** installer's hab      **
				    ULONG cUshort,	** entries in arRMP	**
				    PUSHORT arRMP,	** RMP array		**
				    PBOOL fRegistered); ** msg parms already reg*/
#define HK_MSGCONTROL		   8
    /* BOOL EXPENTRY MsgControlHook(HAB hab,		** installer's hab      **
				    SHORT idContext,	** who called hook	**
				    HWND hwnd,		** SEI window handle	**
				    PSZ pszClassname,	** window class name	**
				    USHORT usMsgclass,	** interested msg class **
				    SHORT idControl,	** SMI_*		**
				    PBOOL fSuccess);	** mode already set	*/
#define HK_PLIST_ENTRY		   9
    /* BOOL EXPENTRY ProgramListEntryHook(HAB hab,	** installer's hab      **
		       PPRFHOOKPARMS pProfileHookParams,** data 		**
		       PBOOL fNoExecute);		** cease hook processing*/
#define HK_PLIST_EXIT		   10
    /* BOOL EXPENTRY ProgramListExitHook(HAB hab,	** installer's hab      **
		PPRFHOOKPARMS pProfileHookParams);	** data 		*/
#define HK_FINDWORD		   11
    /* BOOL EXPENTRY FindWordHook(usCodepage,		** code page to use	**
				  PSZ pszText,		** text to break	**
				  ULONG cb,		** maximum text size	**
				  ULONG ich,		** break 'near' here	**
				  PULONG pichStart,	** where break began	**
				  PULONG pichEnd,	** where break ended	**
				  PULONG pichNext);	** where next word begin*/
#define HK_CODEPAGECHANGED	   12
    /* VOID EXPENTRY CodePageChangedHook(HMQ hmq,	** msg q handle 	**
				  USHORT usOldCodepage, ** old code page	**
				  USHORT usNewCodepage);** new code page	*/

#define HMQ_CURRENT		((HMQ)1)

/* WH_MSGFILTER context codes */

#define MSGF_DIALOGBOX		1
#define MSGF_MESSAGEBOX 	2
#define MSGF_TRACK		8

/* HK_HELP Help modes */

#define HLPM_FRAME		(-1)
#define HLPM_WINDOW		(-2)
#define HLPM_MENU		(-3)

/* HK_SENDMSG structure */

typedef struct _SMHSTRUCT { /* smhs */
	MPARAM	mp2;
	MPARAM	mp1;
	USHORT	msg;
	HWND	hwnd;
} SMHSTRUCT;
typedef SMHSTRUCT FAR *PSMHSTRUCT;

/*HK_LOADER context codes */

#define LHK_DELETEPROC		1
#define LHK_DELETELIB		2
#define LHK_LOADPROC		3
#define LHK_LOADLIB		4

/*HK_MSGCONTROL context codes */

#define MCHK_MSGINTEREST	1
#define MCHK_CLASSMSGINTEREST	2
#define MCHK_SYNCHRONISATION	3
#define MCHK_MSGMODE		4

/*HK_REGISTERUSERMSG conext codes */

#define RUMHK_DATATYPE		1
#define RUMHK_MSG		2

#endif /* INCL_SAADEFS */

#endif /* INCL_WINHOOKS */

/*
 * Include Shell API
 */
#ifndef INCL_SAADEFS
#include <pmshl.h>      /* OS/2 Shell definitions */
#endif /* !INCL_SAADEFS */

#if (defined(INCL_WINCOUNTRY) && !defined(INCL_WINCOUNTRY_INCLUDED))
#define INCL_WINCOUNTRY_INCLUDED

USHORT  APIENTRY WinQueryCp(HMQ hmq);

#ifndef INCL_SAADEFS
BOOL	APIENTRY WinSetCp(HMQ hmq, USHORT idCodePage);
USHORT	APIENTRY WinQueryCpList(HAB hab, USHORT ccpMax, PUSHORT pacp);
BOOL	APIENTRY WinCpTranslateString(HAB hab, USHORT cpSrc, PSZ pszSrc,
				      USHORT cpDst, USHORT cchDestMax,
				      PSZ pszDest);
UCHAR	APIENTRY WinCpTranslateChar(HAB hab, USHORT cpSrc, UCHAR chSrc,
				    USHORT cpDst);

USHORT	APIENTRY WinUpper(HAB hab, USHORT idcp, USHORT idcc, PSZ psz);
USHORT	APIENTRY WinUpperChar(HAB hab, USHORT idcp, USHORT idcc, USHORT c);
PSZ	APIENTRY WinNextChar(HAB hab, USHORT idcp, USHORT idcc, PSZ psz);
PSZ	APIENTRY WinPrevChar(HAB hab, USHORT idcp, USHORT idcc, PSZ pszStart,
                             PSZ psz);
USHORT	APIENTRY WinCompareStrings(HAB hab, USHORT idcp, USHORT idcc, PSZ psz1,
				   PSZ psz2, USHORT reserved);

#define WCS_ERROR		0
#define WCS_EQ			1
#define WCS_LT			2
#define WCS_GT			3

#endif /* !INCL_SAADEFS */

#endif /* INCL_WINCOUNTRY */

/* Heap Manager Interface declarations */

#if (defined(INCL_WINHEAP) && !defined(INCL_WINHEAP_INCLUDED))
#define INCL_WINHEAP_INCLUDED

#ifndef INCL_SAADEFS
typedef LHANDLE HHEAP;

/* structure for moveable heap */

typedef struct _MOVBLOCKHDR {	/* mbhdr */
	NPBYTE *ppmem;
	USHORT cb;
} MOVBLOCKHDR;
typedef MOVBLOCKHDR *PMOVBLOCKHDR;

/* macro for creating a back pointer */

#define SETMEMBACKPTR(npb) (((PMOVBLOCKHDR) npb)-1)->ppmem = &npb

HHEAP  APIENTRY WinCreateHeap(USHORT selHeapBase, USHORT cbHeap,
			      USHORT cbGrow, USHORT chMinDed,
			      USHORT cbMaxDed, USHORT fOptions);
HHEAP  APIENTRY WinDestroyHeap(HHEAP hHeap);
USHORT APIENTRY WinAvailMem(HHEAP hHeap, BOOL fCompact, USHORT cbMinFree);
NPBYTE APIENTRY WinAllocMem(HHEAP hHeap, USHORT cb);
NPBYTE APIENTRY WinReallocMem(HHEAP hHeap, NPBYTE npMem,
			      USHORT cbOld, USHORT cbNew);
NPBYTE APIENTRY WinFreeMem(HHEAP hHeap, NPBYTE npMem, USHORT cbMem);
PVOID  APIENTRY WinLockHeap(HHEAP hHeap);

#define HM_MOVEABLE	0x0001	/* WinCreateHeap() fsOptions parameter */
#define HM_VALIDSIZE	0x0002

#endif /* !INCL_SAADEFS */

#endif /* INCL_WINHEAP */


/*** Atom Manager Interface declarations */

#if (defined(INCL_WINATOM) && !defined(INCL_WINATOM_INCLUDED))
#define INCL_WINATOM_INCLUDED

#ifndef INCL_SAADEFS
typedef LHANDLE  HATOMTBL;
typedef USHORT   ATOM;

HATOMTBL APIENTRY WinQuerySystemAtomTable(VOID);
HATOMTBL APIENTRY WinCreateAtomTable(USHORT cbInitial, USHORT cBuckets);
HATOMTBL APIENTRY WinDestroyAtomTable(HATOMTBL hAtomTbl);
ATOM     APIENTRY WinAddAtom(HATOMTBL hAtomTbl, PSZ pszAtomName);
ATOM     APIENTRY WinFindAtom(HATOMTBL hAtomTbl, PSZ pszAtomName);
ATOM     APIENTRY WinDeleteAtom(HATOMTBL hAtomTbl, ATOM atom);
USHORT   APIENTRY WinQueryAtomUsage(HATOMTBL hAtomTbl, ATOM atom);
USHORT   APIENTRY WinQueryAtomLength(HATOMTBL hAtomTbl, ATOM atom);
USHORT	 APIENTRY WinQueryAtomName(HATOMTBL hAtomTbl, ATOM atom,
				   PSZ pszBuffer, USHORT cchBufferMax);

#define MAKEINTATOM(a)  ((PCH)MAKEULONG(a, 0xffff))
#endif /* !INCL_SAADEFS */

#endif /* INCL_WINATOM */


/*** Catch/Throw Interface declarations */

#if (defined(INCL_WINCATCHTHROW) && !defined(INCL_WINCATCHTHROW_INCLUDED))
#define INCL_WINCATCHTHROW_INCLUDED

#ifndef INCL_SAADEFS
typedef struct _CATCHBUF {  /* ctchbf */
	ULONG	reserved[ 4 ];
} CATCHBUF;
typedef CATCHBUF FAR *PCATCHBUF;

SHORT	APIENTRY WinCatch(PCATCHBUF pctchbf);
VOID	APIENTRY WinThrow(PCATCHBUF pctchbf, SHORT nThrowBack);
#endif /* !INCL_SAADEFS */

#endif /* INCL_WINCATCHTHROW */


#if (defined(INCL_WINERRORS) && !defined(INCL_WINERRORS_INCLUDED))
#define INCL_WINERRORS_INCLUDED

#include <pmerr.h>

/* Error codes for debugging support				*/
/* 0x1001 - 0x1021, 0x1034, 0x1036 - 0x1050 are reserved	*/

#define WINDBG_HWND_NOT_DESTROYED	0x1022
#define WINDBG_HPTR_NOT_DESTROYED	0x1023
#define WINDBG_HACCEL_NOT_DESTROYED	0x1024
#define WINDBG_HENUM_NOT_DESTROYED	0x1025
#define WINDBG_VISRGN_SEM_BUSY		0x1026
#define WINDBG_USER_SEM_BUSY		0x1027
#define WINDBG_DC_CACHE_BUSY		0x1028
#define WINDBG_HOOK_STILL_INSTALLED	0x1029
#define WINDBG_WINDOW_STILL_LOCKED	0x102a
#define WINDBG_UPDATEPS_ASSERTION_FAIL	0x102b
#define WINDBG_SENDMSG_WITHIN_USER_SEM	0x102c
#define WINDBG_USER_SEM_NOT_ENTERED	0x102d
#define WINDBG_PROC_NOT_EXPORTED	0x102e
#define WINDBG_BAD_SENDMSG_HWND 	0x102f
#define WINDBG_ABNORMAL_EXIT		0x1030
#define WINDBG_INTERNAL_REVISION	0x1031
#define WINDBG_INITSYSTEM_FAILED	0x1032
#define WINDBG_HATOMTBL_NOT_DESTROYED	0x1033
#define WINDBG_WINDOW_UNLOCK_WAIT	0x1035

/* Get/Set Error Information Interface declarations */

typedef struct _ERRINFO { /* erri */
	USHORT	cbFixedErrInfo;
	ERRORID idError;
	USHORT	cDetailLevel;
	USHORT	offaoffszMsg;
	USHORT	offBinaryData;
} ERRINFO;
typedef ERRINFO FAR *PERRINFO;

ERRORID  APIENTRY WinGetLastError(HAB hab);
PERRINFO APIENTRY WinGetErrorInfo(HAB hab);
BOOL	 APIENTRY WinFreeErrorInfo(PERRINFO perrinfo);

#endif  /* INCL_WINERRORS */

#ifndef INCL_SAADEFS
#if (defined( INCL_WINDDE) && !defined( INCL_WINDDE_INCLUDED))
#define  INCL_WINDDE_INCLUDED

/* Dynamic Data Exchange (DDE) Structure Declaration */

typedef struct _DDEINIT { /* ddei */
	USHORT	cb;
	PSZ	pszAppName;
	PSZ	pszTopic;
} DDEINIT;
typedef DDEINIT FAR *PDDEINIT;

typedef struct _DDESTRUCT { /* dde */
	ULONG	cbData;
	USHORT	fsStatus;
	USHORT	usFormat;
	USHORT	offszItemName;
	USHORT	offabData;
} DDESTRUCT;
typedef DDESTRUCT FAR *PDDESTRUCT;

/* DDE constants for wStatus field */
#define DDE_FACK		0x0001
#define DDE_FBUSY		0x0002
#define DDE_FNODATA		0x0004
#define DDE_FACKREQ		0x0008
#define DDE_FRESPONSE		0x0010
#define DDE_NOTPROCESSED	0x0020
#define DDE_FRESERVED		0x00C0
#define DDE_FAPPSTATUS		0xFF00

/* DDE public formats */

#define DDEFMT_TEXT		0x0001

/* Dynamic Data Exchange (DDE) Routines */

BOOL	APIENTRY WinDdeInitiate(HWND hwndClient, PSZ pszAppName,
				PSZ pszTopicName);
MRESULT APIENTRY WinDdeRespond(HWND hwndClient, HWND hwndServer,
			       PSZ pszAppName, PSZ pszTopicName);
BOOL	APIENTRY WinDdePostMsg(HWND hwndTo, HWND hwndFrom, USHORT wm,
			       PDDESTRUCT pddes, BOOL fRetry);

/* Dynamic Data Exchange (DDE) Messages */

#define WM_DDE_FIRST		0x00A0
#define WM_DDE_INITIATE 	0x00A0
#define WM_DDE_REQUEST		0x00A1
#define WM_DDE_ACK		0x00A2
#define WM_DDE_DATA		0x00A3
#define WM_DDE_ADVISE		0x00A4
#define WM_DDE_UNADVISE 	0x00A5
#define WM_DDE_POKE		0x00A6
#define WM_DDE_EXECUTE		0x00A7
#define WM_DDE_TERMINATE	0x00A8
#define WM_DDE_INITIATEACK	0x00A9
#define WM_DDE_LAST		0x00AF

/* DDE helper macros */

#define DDES_PSZITEMNAME(pddes) \
	(((PSZ)pddes) + ((PDDESTRUCT)pddes)->offszItemName)

#define DDES_PABDATA(pdde)	\
	(((PBYTE)pdde) + ((PDDESTRUCT)pdde)->offabData)

#define SELTOPDDES(sel) 	((PDDESTRUCT)MAKEP(sel, 0))
#define PDDESTOSEL(pdde)	(SELECTOROF(pdde))
#define PDDEITOSEL(pddei)	(SELECTOROF(pddei))

#endif /* INCL_WINDDE */
#endif /* !INCL_SAADEFS */

#if (defined(INCL_WINWINDOWMGR) && !defined(INCL_WINWINDOWMGR_INCLUDED))
#define INCL_WINWINDOWMGR_INCLUDED
#define WM_QUERYCONVERTPOS	0x00b0

/* Return values for WM_QUERYCONVERTPOS */
#define QCP_CONVERT		0x0001
#define QCP_NOCONVERT		0x0000

#endif  /* INCL_WINWINDOWMGR */

#if (defined(INCL_WINHELP) && !defined(PMHELP_INCLUDED))
#include <pmhelp.h>
#endif /* INCL_WINHELP */

/*Load/Delete Library/Procedure */

typedef HMODULE HLIB;
typedef PHMODULE PHLIB;

#if (defined(INCL_WINLOAD) && !defined(INCL_WINLOAD_INCLUDED))
#define INCL_WINLOAD_INCLUDED
BOOL	APIENTRY WinDeleteProcedure(HAB hab, PFNWP wndproc);
BOOL	APIENTRY WinDeleteLibrary(HAB hab, HLIB libhandle);
PFNWP	APIENTRY WinLoadProcedure(HAB hab, HLIB libhandle, PSZ procname);
HLIB	APIENTRY WinLoadLibrary(HAB hab, PSZ libname);
#endif /* INCL_WINLOAD */


#ifdef INCL_REMAPDLL
#define STR_DLLNAME "keyremap"
#endif /*INCL_REMAPDLL*/

#ifdef INCL_NLS

#define WM_DBCSFIRST		0x00b0
#define WM_DBCSLAST		0x00cf
#define WC_APPSTAT		((PSZ)0xffff0010L)
#define WC_KBDSTAT		((PSZ)0xffff0011L)
#define WC_PECIC		((PSZ)0xffff0012L)
#define WC_DBE_KKPOPUP		((PSZ)0xffff0013L)

#endif /* INCL_NLS */
